DateFormatter将日期更改500年

时间:2016-09-18 20:44:54

标签: ios swift nsdate nsdateformatter date-formatting

我正在运行以下代码:

if let messagedate = curr_comment["timestamp"] as? String {
       let dateFormatter = NSDateFormatter()
       dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
       let date = dateFormatter.dateFromString(messagedate)
}

这是调试器输出:

enter image description here

今天这种情况开始随机发生,我不确定为什么日期会因为这么简单的操作而改变500年。

编辑:这种情况发生在使用佛教日历的设备上。

1 个答案:

答案 0 :(得分:2)

这是因为有问题的设备没有为公历设置。它使用的是佛历。请参阅Apple Technical Q&A 1480,其中讨论了正确处理日期字符串以优雅处理国际日历。

如果此yyyy-MM-dd HH:mm:ss格式用于内部目的(存储在数据库中,与Web服务通信等),则应考虑将格式化程序的区域设置设置为en_US_POSIX。在Swift 3中:

dateFormatter.locale = Locale(identifier: "en_US_POSIX")
Swift 2中的

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")

坦率地说,这也引出了关于日期的字符串表示使用的时区的问题。您通常希望确保日期/时间字符串始终以UTC / GMT格式存储。在Swift 3中:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

或者,在Swift 2中:

dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)

如果您在整个应用程序中始终如一地执行此操作,您将避免出现奇怪的时区问题(例如,如果纽约的某人现在发布了某些内容,我不希望它在CA中告诉我它发生在三小时前)。< / p>