【问题标题】:NSDateFormatter fails to return a datetime for UK region with 12 hour clock set [duplicate]NSDateFormatter 无法返回设置为 12 小时时钟的英国地区的日期时间 [重复]
【发布时间】:2016-03-13 19:24:24
【问题描述】:

此代码适用于我可以确定的每个地区/语言环境组合,除非我将手机设置为英国地区并设置 12 小时制。谁能告诉我为什么?

这适用于所有地区,包括英国,设置 12 小时制:

NSDateFormatter *theDateFormatter = [[NSDateFormatter alloc] init];
theDateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ";

NSString *theLastFetchDateString = @"2015-11-13T01:47:52.4630000Z";
NSDate *theLastFetchDate = [theDateFormatter dateFromString:theLastFetchDateString];

这适用于除英国以外的所有地区,设置为 12 小时制:

NSDateFormatter *theDateFormatter = [[NSDateFormatter alloc] init];
theDateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ";

NSString *theLastFetchDateString = @"2015-11-13T18:14:44.1230000Z";
NSDate *theLastFetchDate = [theDateFormatter dateFromString:theLastFetchDateString];

在第二种情况下,theLastFetchDate 始终为零。

我看到的主要区别是第二个日期以 24 小时格式存储,而解析设备以 12 小时格式存储,但格式化程序 HH 应该能够处理,是吗?

另一个奇怪的事情,它可能只是一个显示的事情,是英国 12 小时时钟格式时间与“a.m.”或“下午”其中美国 12 小时制将它们格式化为“AM”或“PM”。

【问题讨论】:

    标签: ios objective-c nsdateformatter


    【解决方案1】:

    您正在解析 RFC 3339/ISO 8601 日期。因此,您应该将格式化程序的locale 设置为en_US_POSIX

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

    Apple Technical Q&A 1480

    【讨论】:

    • 我仍然面临这个问题,即使我已经为“en_US_POSIX”添加了语言环境。你能帮帮我吗?
    • @KeyurTailor - 请分享示例输入日期字符串和您正在使用的dateFormat 字符串。
    • 嗨@Rob我想要“yyyy-MM-dd HH:mm:ss”,它是 24 小时日期格式,但由于我的手机中有 12 小时日期格式设置,我现在的日期获取始终是 12 小时格式,而我正在检查英国地区
    • 不,我们确实希望看到一个自包含的reproducible example 问题,向我们展示输入、用于产生输出的代码和实际输出。十分之九,问题是一些无害的小问题。顺便说一句,你真的想要那个字符串中间没有典型的T,最后没有Z吗?你用这个字符串做什么?如果没有时区说明符,它将假定本地时区,这通常会引入各种问题本身。我认为您需要发布自己的问题。
    • 嗨@Rob 我已经用我的示例代码提出了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多