NSDateFormatter使用一些国际设置格式化0-24小时范围内的小时数

时间:2016-05-27 15:59:12

标签: ios date datetime nsdate nsdateformatter

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"它会返回这样的日期" 2016-05-26 197 :33:17 PM + 0000"

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

具有自定义格式NSDateFormatter

"yyyy-MM-dd'T'HH:mm:ss"无法解析字符串" 2016-05-26T07:32:57"并返回nil

这不仅发生在我的自定义格式化程序中。负责description的内部基金会格式化程序也会遇到此问题:

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

enter image description here enter image description here

我使用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

enter image description here enter image description here

这是我目前唯一知道的格式化工具。

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

1 个答案:

答案 0 :(得分:0)

根据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发布的具有相同问题链接的每个人都非常有用。 See Technical Q&A 1480.我建议您在将此解决方案应用到代码之前阅读它。