Ios DateFormatter将日期更改500年

Ios DateFormatter将日期更改500年,ios,swift,nsdate,nsdateformatter,date-formatting,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) } 以下是调试器输出: 这是从今

我正在运行以下代码:

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年


编辑:这发生在使用佛历的设备上。

这是因为相关设备未设置为公历。它使用的是佛教日历。请参阅其中讨论如何正确处理日期字符串,以优雅地处理国际日历

如果这个代码> yyyymm dd HH:mm:SS < /COD>格式是用于内部目的(存储在数据库中,与Web服务通信等),则应考虑将格式化程序的设置设置为<代码> EnU.SuPix。在Swift 3中:

dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
在Swift 2中:

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)

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

dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
或者,在Swift 2中:

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)

如果你在整个应用程序中始终这样做,你将避免奇怪的时区问题(例如,如果纽约有人现在发布了一些东西,我不想让它在CA告诉我事情发生在三个小时前)。

这无疑是因为所讨论的设备的
区域设置
没有设置为公历。如果这个代码> yyyymm dD HH:mm:SS < /COD>格式是用于内部目的(存储在数据库中,与Web服务通信等),则应考虑将格式化程序的<代码>位置> /代码>设置为<代码> EnuSuxPix。请看。这是我可以在appDelegate中为整个应用程序全局执行的操作,还是我必须为应用程序中使用的每个dateFormatter执行的操作?它基本上用于显示消息/评论发布给应用程序的其他用户的时间有多长?我是否可以简单地添加它
dateFormatter.locale=NSLocale(localeIdentifier:“en_US_POSIX”)
让我们看看。你怎么知道它是佛教徒的?我作弊了。当我向OP指出不同的日历是问题所在时,他告诉我问题发生在使用佛教日历的朋友的设备上。但这是一个众所周知的问题,在各种非公历中都会出现,因此,与佛教历法相比,佛教历法更为重要的是,没有使用
en_US_POSIX的
区域设置