我们的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错误?
答案 0 :(得分:1)
格式样式只应用于将NSDate
个对象转换为文本以显示给用户。解析已知格式的日期字符串时,必须使用特定格式,而不是样式。 en_US_POSIX
语言环境的使用用于确保操作系统不会根据用户首选项(例如24小时时间设置)调整您指定的格式。
因此,正如您所怀疑的那样,您需要删除两个调用以设置日期和时间样式,并将其替换为调用以设置与您需要解析的已知日期/时间字符串匹配的特定格式。
答案 1 :(得分:0)
通常,您不应将格式化的日期输出到文件,以后再想要解析它
日期应存储为长值UTC(带或不带额外的TimeZone偏移)。
只有在最后一刻,在将日期可视化为UI之前,应该格式化并应用本地时间。
这不仅仅是我的经验,它也在Apple DateFormatting Doku中有说明。