2013-03-19 39 views
3

我遇到了一个陌生人的问题。 NSDateFormatter无法将1988-04-10解析为iOS 6中的NSDate实例,但它适用于iOS 4和iOS 5.它是一个错误吗?NSDateFormatter无法将“1988-04-10”解析为iOS 6中的NSDate实例。这是一个错误吗?

以下是验证码。这很简单。

NSArray *values = @[@"1988-04-09", @"1988-04-10", @"1988-04-11"]; 
NSDateFormatter* df = [[NSDateFormatter alloc] init]; 
NSLocale *posixLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[df setLocale:posixLocale]; 
[df setDateFormat:@"yyyy'-'MM'-'dd"]; 
NSLog(@"timeZone:%@, locale:%@", df.timeZone, df.locale.localeIdentifier); 
NSDate* date = nil; 
for (NSString *value in values) { 
    date = [df dateFromString:value]; 
    NSLog(@"The date is %@", date); 
} 
[posixLocale release]; 
[df release]; 

以下是结果在IOS 4和iOS 5.

2013-03-19 09:55:32.249 SampleProject[1844:f803] timeZone:Asia/Shanghai (CST (China)) offset 28800, locale:en_US_POSIX 
2013-03-19 09:55:32.250 SampleProject[1844:f803] The date is 1988-04-08 16:00:00 +0000 
2013-03-19 09:55:32.250 SampleProject[1844:f803] The date is 1988-04-09 16:00:00 +0000 
2013-03-19 09:55:32.251 SampleProject[1844:f803] The date is 1988-04-10 15:00:00 +0000 

以下是结果在IOS 6.

2013-03-19 09:42:40.824 SampleProject[1455:11303] timeZone:Asia/Shanghai (GMT+08:00) offset 28800, locale:en_US_POSIX 
2013-03-19 09:42:40.827 SampleProject[1455:11303] The date is 1988-04-08 16:00:00 +0000 
2013-03-19 09:42:40.827 SampleProject[1455:11303] The date is (null) 
2013-03-19 09:42:40.828 SampleProject[1455:11303] The date is 1988-04-10 15:00:00 +0000 

它是空值1988-04-10。是一个错误。任何人都可以解释吗?

回答

9

4月10日星期日00:00是Daylight Saving Time in Shanghai that year的开关。

根据伟大的WWDC 2011视频:Performing Calendar Calculations这可能导致未定义的行为。在视频中,里约热内卢因为同样的原因被选为例子。

一种解决方法是添加时间,即保存为下午3点。
另一个对NSDateComponents进行计算。
视频中解释了两种解决方法。

+1

确实,http://www.timeanddate.com/worldclock/timezone.html?n=237&syear=1980 – Joni 2013-03-19 02:07:27

+1

这是疯了,你知道的! +1 – borrrden 2013-03-19 02:07:49

+1

酷,这是理由。非常感谢你。 – 2013-03-19 02:23:36

相关问题