【发布时间】:2018-05-31 12:52:39
【问题描述】:
我注意到 iOS 11.3 上的 DateFormatter 有一个奇怪的情况。我正在尝试使用以下代码将字符串转换为日期:
let dateString = "2018-05-31 11:45:24Z"
let dateFormat = "yyyy-MM-dd HH:mm:ss'Z'"
var dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateFormat
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
let date = dateFormatter.date(from: dateString)
奇怪的是,在模拟器上它可以工作,但在我的 iPhone 上却不行(日期为零)。 据我所知,模拟器上 dateFormatter 的语言环境是 en_US,而在我的 iPhone 上是 en_RO。
如果我将 DateFormatter 的 Locale 显式设置为 en_US,它会返回正确的值。
dateFormatter.locale = Locale(identifier: "en-US")
更重要的是,在我将手机的地区更改为美国后,它可以正确返回,即使我将其更改回罗马尼亚后也可以正常工作。我尝试重新启动手机,但它仍然有效。
这个问题只出现在 iOS 11 上,代码没有变化,根据我的测试,它在 Swift 和 Objective-C 中都有。
这导致我的应用程序出现问题。我可以强制区域设置为“en-US”,并希望它能解决问题。
有没有其他人遇到过这种情况?有没有其他方法可以解决这个问题?
【问题讨论】:
-
比较stackoverflow.com/a/16706425/1187415、stackoverflow.com/q/40692378/1187415、stackoverflow.com/q/6613110/1187415、developer.apple.com/library/content/qa/qa1480/_index.html - 将语言环境设置为“en_US_POSIX”是解析固定格式时的正确方法。
-
感谢您使用 en_US_POSIX 的建议,我会尝试的。但是为什么在我切换语言环境后它会起作用并且它只发生在 iOS 11 上呢?
-
你也可以使用当前本地:dateFormatter.locale = Locale.current
-
@RaduCarlig 参考这个答案stackoverflow.com/a/46206511/7694178 我想你的手机语言环境是
_RO区域和iOS11currentLocale行为强制它使用应用程序的基本语言en_RO。所以现在格式化程序的最佳选择是如上所述强制他们的语言环境。
标签: ios swift dateformatter