【问题标题】:DateFormatter behaves different based on user time settingsDateFormatter 的行为根据用户时间设置而有所不同
【发布时间】:2017-09-13 02:19:24
【问题描述】:

我遇到了一些特殊情况,我不确定它为什么会发生或如何处理它。

let formatter = DateFormatter()
formatter.dateFormat = "h:mma"
let timeString = "8:00am"
let date = formatter.date(from: timeString)!

如果用户将时间设置为使用 12 小时制,则此代码有效。如果他们将设备设置为 24 小时制,它就会崩溃。

如何让它独立于用户的设置工作?

【问题讨论】:

标签: ios swift nsdateformatter foundation


【解决方案1】:

试试这个代码,你需要为你的日期设置时区,

let formatter = DateFormatter()
formatter.dateFormat = "h:mma"
formatter.timeZone = TimeZone.init(identifier: "UTC")
let timeString = "8:00am"
let date = formatter.date(from: timeString)!

print(date)

【讨论】:

    【解决方案2】:

    您必须将语言环境更改为标准 POSIX 语言环境:

    formatter.locale = Locale(identifier: "en_US_POSIX")
    

    technical note QA1480

    在 iOS 上,用户可以覆盖默认的 AM/PM 与 24 小时时间设置(通过设置 > 常规 > 日期和时间 > 24 小时时间),这会导致 NSDateFormatter 重写您设置的格式字符串,这可以导致您的时间解析失败。

    请注意,如果您不解析/编码数据,则强制执行特定的时间格式是一种不好的做法。如果您想向用户显示格式化的时间,更好的解决方案是使用用户定义的格式:

    let formatter = DateFormatter()
    formatter.dateStyle = .none
    formatter.timeStyle = .short
    

    【讨论】:

    • “强制执行特定的时间格式是一种不好的做法(如果您不解析/编码数据)。” ...问题似乎是“我该怎么做解析此数据,”在这种情况下,正确答案使用.locale。 “更好的解决方案”——在这种情况下——失败了。
    • @DonMag 我实际上没有看到任何关于解析的内容,但我会稍微改变我的回答语气。
    • 是的,这是专门用于从服务器解析预定格式的数据的,所以我觉得这个解决方案很舒服。谢谢!
    • 顺便说一下,在 Swift 3 中它现在是 formatter.locale = Locale(identifier: "en_US_POSIX")
    • @Erik 我建议阅读上面的技术说明。请记住,您应该在解析时始终设置语言环境,否则您可能会遇到日历和其他特定于语言环境的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多