DateFormatter 将日期更改 500 年
DateFormatter Changes Date by 500 Years
我是运行以下代码:
if let messagedate = curr_comment["timestamp"] as? String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.dateFromString(messagedate)
}
这是调试器的输出:
这是今天开始随机发生的,我不知道为什么通过这么简单的操作,日期就改变了 500 年。
编辑:这发生在使用佛历的设备上。
因为问题设备没有设置公历。它使用的是佛历。请参阅 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")
坦率地说,这也引出了一个问题,即日期的字符串表示使用的是哪个时区。您通常希望确保 date/time 字符串始终存储在 UTC/GMT 中。在 Swift 3:
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
或者,在 Swift 2:
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
如果你在整个应用程序中始终如一地这样做,你将避免奇怪的时区问题(例如,如果纽约的某人现在发布了一些东西,我不希望它告诉我在 CA 它发生在三小时前) .
我是运行以下代码:
if let messagedate = curr_comment["timestamp"] as? String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.dateFromString(messagedate)
}
这是调试器的输出:
这是今天开始随机发生的,我不知道为什么通过这么简单的操作,日期就改变了 500 年。
编辑:这发生在使用佛历的设备上。
因为问题设备没有设置公历。它使用的是佛历。请参阅 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")
坦率地说,这也引出了一个问题,即日期的字符串表示使用的是哪个时区。您通常希望确保 date/time 字符串始终存储在 UTC/GMT 中。在 Swift 3:
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
或者,在 Swift 2:
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
如果你在整个应用程序中始终如一地这样做,你将避免奇怪的时区问题(例如,如果纽约的某人现在发布了一些东西,我不希望它告诉我在 CA 它发生在三小时前) .