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

标签 ios objective-c cocoa-touch nsdate nscalendar

我遇到了一个奇怪的问题。 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];

以下是 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 是 Daylight Saving Time in Shanghai that year 的开关.

根据出色的 WWDC 2011 视频:Performing Calendar Calculations这可能会导致未定义的行为。出于同样的原因,在视频中选择里约热内卢作为示例。

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

关于ios - NSDateFormatter 无法将 '1988-04-10' 解析为 iOS 6 中的 NSDate 实例。这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490235/

相关文章:

iphone - 如何转移View但不关闭View数据?

iphone - 如何为 iPhone 创建自定义弹出窗口?

ios - 使用缓存实现 PFQueryTableViewController

iphone - 如何让IPJSUA成为.IPA文件?

objective-c - iOS Sprite Kit 如何在横向方向上使弹丸指向目标?

ios - 如何在 Swift 中使用 Apple map - 你必须使用 C 还是 Swift 可以?

objective-c - 发送到释放实例的 CFDictionary objectForKey 消息

objective-c - iOS:显示加载图像时的黑色状态栏

iphone - 如何以编程方式访问通知设置

c++ - 全局 std::string 在 iOS 上导致崩溃