代码之家  ›  专栏  ›  技术社区  ›  Be_patience_be_happy

从NSDateComponents创建的NSDate不正确?

  •  1
  • Be_patience_be_happy  · 技术社区  · 8 年前

    我创建了一个 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分钟的间隙。 但是,如果我将timeZone设置为 [NSTimeZone timeZoneForSecondsFromGMT:] ,即使秒数偏差为28800,这也是正常的。 这是什么原因?

    3 回复  |  直到 8 年前
        1
  •  1
  •   gnasher729    8 年前

    不,日期没有错。相反,NSCalendar代码知道一些你做梦都想不到的关于日历的事情,比如日历在过去的某个时间点更改它们的时间偏移量。

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

        2
  •  1
  •   trojanfoe    8 年前

    有趣的问题。你所看到的是1901年1月1日,时区从当地平均时间改为中国标准时间的影响,当时时钟调回了05m43秒。

    更多详细信息 here .

        3
  •  -2
  •   Sanjeet Verma    8 年前

    试试这个!!

    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];
    

    希望此帮助:)