从NSDateComponents创建的NSDate不正确?

时间:2016-05-25 07:05:56

标签: ios nsdate nscalendar nsdatecomponents

我使用带有NSDate标识符的dateFromComponents NSCalendar创建NSGregorianCalendar,这是奇怪的部分: 如果日期在1900/12/31之前的某个时间点之前,则日期不正确

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = 1900; components.month = 12; components.day = 31;
NSDate *date = [calendar dateFromComponents:components];

components.year = 1901; components.month = 1; components.day = 1;
NSDate *date2 = [calendar dateFromComponents:components];

NSLog(@"%@",calendar.timeZone.description); 
NSLog(@"%@",date);
NSLog(@"%@",date2);

日志将是:

2016-05-25 14:58:21.014 date[79754:2192157] Asia/Shanghai (GMT+8) offset 28800
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-30 15:54:17 +0000
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-31 16:00:00 +0000

如您所见,白天有5分钟的差距。 但是,如果我将时区设置为[NSTimeZone timeZoneForSecondsFromGMT:],即使具有相同的秒偏差 - 28800,也是正常的。 造成这种情况的原因是什么?

3 个答案:

答案 0 :(得分:1)

有趣的问题。您所看到的是当时钟被转回05m43s时,从01-01-1901的本地平均时间到中国标准时间的时区变化的影响。

更多详情here

答案 1 :(得分:1)

不,日期不正确。相反,NSCalendar代码知道您不会想到的有关日历的事情,例如日历在过去的某些时间点更改其时间偏移。

您要求亚洲/上海日历转换两个日期,一个在他们更改时区的前一天,一个在他们更改时区的第二天,并且两个时间都正确转换。那天晚上,上海的每个人都要调整手表。

答案 2 :(得分:-2)

试试这个!!

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];

[components setYear:1987];
[components setMonth:3];
[components setDay:17];
[components setHour:14];
[components setMinute:20];
[components setSecond:0];

NSDate *date = [calendar dateFromComponents:components];

希望这个帮助:)