3

奇妙な質問に遭遇しました。NSDateFormatter は、iOS 6 の NSDate インスタンスに解析できません1988-04-10。しかし、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

の場合は null です1988-04-10。はバグです。誰でも説明できますか?

4

1 に答える 1

9

4月10日(日)00:00は、その年の上海での夏時間の切り替えでした。

素晴らしいWWDC2011ビデオによると:カレンダー計算の実行これは未定義の動作につながる可能性があります。ビデオでは、まったく同じ理由でリオデジャネイロが例として選ばれています。

回避策の1つは、午後3時として時間を追加することです。
NSDateComponentsで計算を行うもう1つ。
両方の回避策はビデオで説明されています。

于 2013-03-19T02:06:31.197 に答える