2

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

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 对象文件似乎被解析没有问题,但是某些(百分之几)日期没有按预期转换 - 它们使if let dateObj = dateFormater.date(from: self)语句失败并且是返回为“错误转换日期”。

我不知道发生了什么。我已经尝试删除dateFormater.locale = Locale.current,它没有任何区别。

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

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

感谢您收到任何帮助或建议。

有没有办法让我的代码更健壮?鉴于应用程序、数据文件、Xcode 和 MacOS 都相同,任何人都可以提出为什么不同的机器可能会有所不同。

4

2 回答 2

2

您的错误来自这一行:dateFormater.locale = Locale.current。您的两台机器可能设置为使用不同的语言环境。

按住选项键的同时单击运行,然后检查两台机器上的应用程序区域设置是什么。

于 2017-05-25T13:48:59.437 回答
0

我感谢所有回复的人。

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

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

代替 ' dateFormater.locale = Locale.current' 行。它现在可以完美运行,并且可以毫无问题地在设备之间进行交换。

于 2017-05-25T14:19:53.377 回答