iOS 6.1 NSDateFormatter自iOS 5以来发生了变化 - 破解了吗?

时间:2013-02-08 14:11:31

标签: iphone ios objective-c ios6 nsdateformatter

我们的iOS iPhone应用程序包含此代码,该代码在iOS 5中生成名为 resultDate 的有效NSDate对象:

    static NSDateFormatter *invariantFmt = nil;
    if (!invariantFmt) {
        invariantFmt = [[NSDateFormatter alloc] init];
        NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
        [invariantFmt setLocale:locale];
        [locale release];
        [invariantFmt setDateStyle:NSDateFormatterShortStyle];
        [invariantFmt setTimeStyle:NSDateFormatterMediumStyle];
    }
    NSDate *resultDate = [invariantFmt dateFromString:@"08/04/2010 10:43:39 AM"];

升级到XCode 4.6和iOS 6.1后,该代码现在为resultDate提供了一个nil,因此用于解析的内容已经发生了变化。发行说明没有说明NSDateFormatter的变化。互联网研究只发现他们可能已经改变为使用更新的Unicode UTS Locale解析标准。显然他们改变了某事。在使用代码并获取已知的有效NSDate对象并应用相同的NSDateFormatter设置来获取NSString之后,我发现iOS 6.1喜欢这个字符串:@“08/04 / 2010,10:43:39 AM”

唯一的区别是日期部分之后的额外逗号。在iOS 6.1中使用它会使用相同的上述代码返回有效日期。有人看到这个,并理解为什么这是不同的,或者这是一个正确的Unicode更改或Apple错误?

2 个答案:

答案 0 :(得分:1)

格式样式只应用于将NSDate个对象转换为文本以显示给用户。解析已知格式的日期字符串时,必须使用特定格式,而不是样式。 en_US_POSIX语言环境的使用用于确保操作系统不会根据用户首选项(例如24小时时间设置)调整您指定的格式。

因此,正如您所怀疑的那样,您需要删除两个调用以设置日期和时间样式,并将其替换为调用以设置与您需要解析的已知日期/时间字符串匹配的特定格式。

答案 1 :(得分:0)

通常,您不应将格式化的日期输出到文件,以后再想要解析它 日期应存储为长值UTC(带或不带额外的TimeZone偏移)。 只有在最后一刻,在将日期可视化为UI之前,应该格式化并应用本地时间。

这不仅仅是我的经验,它也在Apple DateFormatting Doku中有说明。