SWIFT不一致的DateFormatter结果

时间:2017-05-25 13:41:49

标签: json swift macos dateformatter

我正在使用字符串扩展函数来转换日期字符串。功能是:

func convertDateString() -> String {
    let dateFormater = DateFormatter()
    var returnString = ""
    dateFormater.dateFormat = "yyyy-MM-dd'T'hh:mm:ss'Z'"    // Takes the format from the JSON journal entry for elite dangerous
    dateFormater.locale = Locale.current
    if let dateObj = dateFormater.date(from: self) {
    dateFormater.dateFormat = "dd MMM yyyy  hh:mm:ss"       // Converts it to a new string (as a date object)
        returnString = dateFormater.string(from: dateObj)   // Converts the date object back to a string
    } else {
        returnString = "Error converting date"
    }
    return returnString
}

我使用的数据集是一系列JSON对象,调用字符串扩展名来转换JSON参考文件的部分结果。

我正在使用两台机器 - 一台是MACPRO,一台是MacBookAir。两者都运行相同版本的MacOS(10.12.5)和相同版本的Xcode。

当我在MACPRO上运行应用程序时,它会解析JSON目标文件而不会出现问题,并按照上面显示的函数正确转换每个日期。但是,当我在MacBookAir上运行应用程序时,在完全相同的数据文件上,JSON目标文件似乎在没有问题的情况下被解析,但是一些(百分之几)的日期没有按预期转换 - 它们使{{1}失败}}语句并返回“错误转换日期”。

我无法弄清楚发生了什么。我尝试删除if let dateObj = dateFormater.date(from: self)并没有任何区别。

相同的JSON对象产生错误(即每次运行文件时,它都是产生“Error conversion date”响应的相同JSON对象)。当我在文本编辑器中查看JSON目标文件时,JSON对象似乎没有问题(我也在在线JSON对象格式化程序中确认了这一点,它正确地读取了JSON对象。)

我还应该补充说我正在使用SwiftyJSON来解析JSON对象。

感激不尽的任何帮助或建议。

有没有办法让我的代码更健壮?任何人都可以建议为什么不同的机器可能会有所不同,因为数据文件,Xcode和MacOS都是相同的。

2 个答案:

答案 0 :(得分:2)

您的错误来自此行:dateFormater.locale = Locale.current。您的两台计算机可能已设置为使用不同的区域设置。

在按住选项键的同时单击运行,并检查两台计算机上的“应用程序区域”设置。

答案 1 :(得分:0)

感谢所有回复的人。

阅读Code Different引用的文章后,关注David提出的问题,将以下几行添加到我的代码中:

    dateFormater.calendar = Calendar(identifier: .iso8601)
    dateFormater.locale = Locale(identifier: "en_US_POSIX")
    dateFormater.timeZone = TimeZone(secondsFromGMT: 0)

代替&{39; dateFormater.locale = Locale.current'线。它现在可以完美地工作并在设备之间交换而没有问题。