NSDateFormatter仅在特定时区为特定日期返回nil

时间:2013-01-16 23:26:51

标签: iphone nsdate nsdateformatter nsdatecomponents nstimezone

鉴于此代码:

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

为什么?

3 个答案:

答案 0 :(得分:3)

我不确定,但是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不存在在约旦时间的安曼。

答案 1 :(得分:1)

我从1970年到现在经历了几年,几个月和几天的循环,在DST开始的安曼日期,nil被退回。

答案 2 :(得分:0)

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

希望这会有所帮助