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. 我建议您在将此解决方案应用于您的代码之前阅读它。
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. 我建议您在将此解决方案应用于您的代码之前阅读它。