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

Vin*_*Xie 3 cocoa-touch objective-c nsdate nscalendar ios

我遇到了一个陌生人的问题.NSDateFormatter无法解析1988-04-10到iOS 6中的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];
Run Code Online (Sandbox Code Playgroud)

以下是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
Run Code Online (Sandbox Code Playgroud)

以下是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
Run Code Online (Sandbox Code Playgroud)

它是空的1988-04-10.是一个错误.有人能解释一下吗?

Vik*_*ica 9

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

根据伟大的WWDC 2011视频:执行日历计算,这可能导致不确定的行为.在视频中,选择里约热内卢为例也是出于同样的原因.

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