iOS自带三种日历,公历、佛教日历和日本日历,要设置日历可以进入"设置-通用-语言与地区-日历"设置,我们中国使用的iPhone默认设置成公历。而泰国人使用的iPhone默认设置的日历是佛教日历。这样会导致同样的代码在国内显示正常,去泰国就仿佛穿越了一般。
问题:使用NSDate *today = [NSDate date];获取的当前的时间在国内显示正常是2017年,而到了泰国却变成了2056年,这是为什么呢?即使是时区差别,也不能差如此多呀??
经过仔细思考,发现语言和地区的设置之中有一个地方可以设置日历,进去把公历改成佛教日历,发现原来显示的2017变成了2056。
解决办法:提供一种不受时区、系统日历、本地化等限制,获得公历中的正确的年份、月份、时间等的方法。
Global.h
@property (strong,nonatomic) NSCalendar *calendar; @property (strong,nonatomic) NSDateComponents *components; @property (copy,nonatomic) NSString *year; @property (copy,nonatomic) NSString *month; @property (copy,nonatomic) NSString *day; @property (copy,nonatomic) NSString *hour; @property (copy,nonatomic) NSString *minute; @property (copy,nonatomic) NSString *second;
Global.m
- (NSCalendar *)calendar{ if(!_calendar){ #ifdef __IPHONE_8_0 _calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];//根据Identifer获取公历 #else _calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//根据Identifer获取公历 #endif _calendar.timeZone = [NSTimeZone localTimeZone];//消除时区差异 _calendar.locale = [NSLocale currentLocale];//消除本地化差异,本地化包括语言、表示的日期格式等 } return _calendar; } - (NSDateComponents *)components{ if (!_components) { NSDate *date = [NSDate date]; _components = [self.calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday fromDate:date]; } return _components; } //返回当前年份 - (NSString *)year{ if (!_year) { _year = [NSString stringWithFormat:@"%04ld",[kGlobal.components year]]; } return _year; } //返回当前月份 -(NSString *)month{ if (!_month) { _month = [NSString stringWithFormat:@"%02ld",[kGlobal.components month]]; } return _month; } //返回当前号数 - (NSString *)day{ if (!_day) { _day = [NSString stringWithFormat:@"%02ld",[kGlobal.components day]]; } return _day; } //返回当前的小时 - (NSString *)hour{ if (!_hour) { _hour = [NSString stringWithFormat:@"%02ld",[kGlobal.components hour]]; } return _hour; } //返回当前的分钟 - (NSString *)minute{ if (!_minute) { _minute = [NSString stringWithFormat:@"%02ld",[kGlobal.components minute]]; } return _minute; } //返回当前的秒钟 - (NSString *)second{ if (!_second) { _second = [NSString stringWithFormat:@"%02ld",[kGlobal.components second]]; } return _second; }
原文:http://www.cnblogs.com/wobuyayi/p/6308819.html