NSDateFormatter无法将“1988-04-10”解析为iOS 6中的NSDate实例。 这是一个错误吗?

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

以下是代码。 这很简单。

 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为零。 是一个错误。 有谁能解释一下?

4月10日星期日00:00是当年上海夏令时的转换。

根据伟大的WWDC 2011video: 执行日历计算,这可能导致不确定的行为。 在video中,里约热内卢被选为例子的原因完全相同。

一种解决方法可能是添加一个时间,即保存时间为下午3点。
另一个在NSDateComponents上进行计算。
video中解释了这两种解决方法。