【发布时间】:2013-01-24 07:53:36
【问题描述】:
我们的 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 的变化。 Internet 研究表明,他们可能已更改为使用更新的 Unicode UTS 语言环境解析标准。显然他们改变了一些东西。在处理完代码并获取一个已知的有效 NSDate 对象并应用相同的 NSDateFormatter 设置来获取一个 NSString 之后,我发现 iOS 6.1 更喜欢这个字符串:@"08/04/2010, 10:43:39 AM"
唯一的区别是日期部分后面的额外逗号。在 iOS 6.1 中使用它会返回一个具有相同上述代码的有效日期。任何人看到这一点并理解为什么会有所不同,或者这是一个好的 Unicode 更改还是 Apple 错误?
【问题讨论】:
-
您应该向 Apple 提交错误报告。
-
或者我应该停止使用日期“样式”(短、中、长)并使用确切的格式,例如调用 setDateFormat 吗?在这种情况下,这似乎在两个 iOS 版本中都有效。
-
这不会让 i18n 变得困难吗?
-
是的,完全正确。我们试图按照 Apple 推荐的方式来处理传入的日期,将它们转换为不变的(POSIX 英语)语言环境格式,然后将它们发送到具有这些样式的解析器。好吧,看看我们在哪里 :(
-
欢迎使用机器...
标签: iphone ios objective-c ios6 nsdateformatter