NSDateFormatter 将小时格式化为 0-24 范围内的一些国际设置

NSDateFormatter formats hours in range out of 0-24 with some international settings

iOS 的一个特定日期和区域设置配置使 NSDateFormatter 有一个非常奇怪的行为。它会忽略我的格式字符串并使用 0-24 范围外的值格式化小时。

#define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ"
formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @DATE_FORMAT;
return [formatter stringFromDate:value];

使用自定义格式:"yyyy-MM-dd'T'HH:mm:ssZ" returns 日期如下“2016-05-26 197:33:17 PM +0000”

日期和时间部分和 197 小时之间没有 'T' 个字符...

NSDateFormatter 自定义格式 "yyyy-MM-dd'T'HH:mm:ss" 无法解析字符串“2016-05-26T07:32:57”和 returns nil.

这不仅发生在我的自定义格式化程序上。负责 description 的内部 Foundation 格式化程序遇到了这个问题:

(lldb) po value.description
2016-05-27 44:20:27 AM +0000

我在 iOS 9.3.2:

上使用特定系统区域设置重现了此行为
"General">"Date & Time">"24-Hour Time" OFF
"General">"Date & Time">"Set Automatically" OFF
"General">"Date & Time">"Time Zone" Moscow

"General">"International">"Language" Русский (Russian)
"General">"International">"Prefferred language order" Русский (Russian), English (U.S.)
"General">"International">"Regional Format"  Russia
"General">"International">"Calendar" Gregorian

这是我目前所知道的使格式化程序以这种方式工作的唯一配置。

有人知道如何解决这个问题吗?我会很感激任何关于如何分析这个的想法,因为我没有自己的想法。

根据 rmaddy 和 Rob 的评论,在这种情况下正确的解决方案是为序列化 NSDate 对象中涉及的所有格式化程序指定 "en_US_POSIX" 语言环境。

所以问题部分的截图应该是:

#define DATE_FORMAT "yyyy-MM-dd HH:mm:ssZ"
formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @DATE_FORMAT;

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

return [formatter stringFromDate:value];

Rob 发布的 link 对于遇到相同问题的每个人都非常有用。 See Technical Q&A 1480. 我建议您在将此解决方案应用于您的代码之前阅读它。