【问题标题】:NSDateFormatter returns nil for specific date only in certain time zonesNSDateFormatter 仅在特定时区为特定日期返回 nil
【发布时间】:2012-12-31 10:36:49
【问题描述】:

鉴于此代码:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyyMMdd"];
NSArray *datesArray = @[@"20130326", @"20130327", @"20130328", @"20130329", @"20130330", @"20130331", @"20130401"];
for (NSString *dateString in datesArray) {
    NSDate *date = [dateFormatter dateFromString:dateString];
    NSLog(@"date: %@", date);
}

这是我的时区 (EST) 中的输出:

date: 2013-03-26 04:00:00 +0000
date: 2013-03-27 04:00:00 +0000
date: 2013-03-28 04:00:00 +0000
date: 2013-03-29 04:00:00 +0000
date: 2013-03-30 04:00:00 +0000
date: 2013-03-31 04:00:00 +0000
date: 2013-04-01 04:00:00 +0000

当我转到设置 -> 常规 -> 日期和时间,并将时区设置为约旦安曼 (GMT+3) 时,这是相同代码的输出:

date: 2013-03-25 22:00:00 +0000
date: 2013-03-26 22:00:00 +0000
date: 2013-03-27 22:00:00 +0000
date: (null)
date: 2013-03-29 21:00:00 +0000
date: 2013-03-30 21:00:00 +0000
date: 2013-03-31 21:00:00 +0000

为什么?

【问题讨论】:

    标签: iphone nsdate nsdateformatter nsdatecomponents nstimezone


    【解决方案1】:

    我不确定,但28日约旦安曼的时钟发生变化可能不是巧合:http://www.evi.com/q/when_do_the_clocks_change_in_amman_jordan

    我的怀疑是时钟从 2013-03-28 21:59:59 跳到 2013-03-28 23:00:00,所以时间 2013-03-28 22:00:00 不存在在约旦安曼时区。

    【讨论】:

    • 您的假设是正确的,但即使在将时间标准化后,约旦安曼仍有日期导致 NSDateFormatter 返回 nil。非常非常奇怪。到目前为止,我只在这个时区看到过。
    【解决方案2】:

    从 1970 年到现在,我在数年、数月和数天内运行了一个循环,在 DST 在安曼开始的日期,nil 被返回。

    【讨论】:

      【解决方案3】:

      我认为当您从字符串设置值时,您必须为dateFormatter 指定时区。请参阅this question,它不是完全相同的问题,但它可以提供帮助。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2012-10-07
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多