ios - DateFormatter 将日期更改了 500 年

标签 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 年。

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

最佳答案

这是因为相关设备未设置公历。它使用的是佛教历法。请参阅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)

如果您在整个应用程序中始终如一地这样做,您将避免奇怪的时区问题(例如,如果纽约的某人现在发布了某些内容,我不希望它告诉我在加利福尼亚州它发生在三个小时前)。

关于ios - DateFormatter 将日期更改了 500 年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562517/

相关文章:

objective-c - 如何将标签放入表格单元格?

iphone - 动画中关键值的标识DidStop

ios - 在 ios swift 中以编程方式呈现新 Controller 仅显示空白屏幕

swift - NSDate 变量为 nil

string - 将 NSDate 转换为 NSString 时设置了错误的年份

ios - KeychainItemWrapper 迁移数据抛出错误

ios - Swift - 不能使 scrollview 能够向左滚动吗?

xcode 7.3 UI测试随机通过或失败

ios - 给定日期加上 1 个月的奇怪日期结果

ios - swift - 我可以比较 Any.Type 吗?