DateFormatter 根据用户时间设置表现不同

DateFormatter behaves different based on user time settings

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

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

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

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

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

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)

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

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

参见 technical note QA1480:

On iOS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set, which can cause your time parsing to fail.

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

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