从 NSDateComponents 创建的 NSDate 不正确?
NSDate created from NSDateComponents incorrect?
我通过 dateFromComponents
创建了一个 NSDate
,使用 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 分钟的间隔。
但是,如果我将 timeZone 设置为 [NSTimeZone timeZoneForSecondsFromGMT:]
,即使有相同的秒偏差 - 28800,它也是正常的。
这是什么原因?
试试这个!!
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];
希望这个帮助:)
有趣的问题。您看到的是 01-01-1901 时区从本地标准时间更改为中国标准时间的影响,当时时钟拨回 05 分 43 秒。
更多详情here。
不,日期没有错误。相反,NSCalendar 代码知道您做梦也想不到的关于日历的事情,比如日历在过去的某个时间点改变它们的时间偏移。
您要求 Asia/Shanghai 日历转换两个日期,一个是他们更改时区的前一天,一个是他们更改时区后的一天,并且两个时间都正确转换。那天晚上,全上海的人都得调表。
我通过 dateFromComponents
创建了一个 NSDate
,使用 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 分钟的间隔。
但是,如果我将 timeZone 设置为 [NSTimeZone timeZoneForSecondsFromGMT:]
,即使有相同的秒偏差 - 28800,它也是正常的。
这是什么原因?
试试这个!!
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];
希望这个帮助:)
有趣的问题。您看到的是 01-01-1901 时区从本地标准时间更改为中国标准时间的影响,当时时钟拨回 05 分 43 秒。
更多详情here。
不,日期没有错误。相反,NSCalendar 代码知道您做梦也想不到的关于日历的事情,比如日历在过去的某个时间点改变它们的时间偏移。
您要求 Asia/Shanghai 日历转换两个日期,一个是他们更改时区的前一天,一个是他们更改时区后的一天,并且两个时间都正确转换。那天晚上,全上海的人都得调表。