【问题标题】:SWIFT Inconsistent DateFormatter resultSWIFT 不一致的 DateFormatter 结果
【发布时间】:2017-10-26 04:47:05
【问题描述】:

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

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 都相同,任何人都可以提出为什么不同的机器可能会有所不同。

【问题讨论】:

  • Apple 在this article 中写过类似的问题。如果您的目标是 OS X 10.12 及更高版本,请使用 ISO8601DateFormatter
  • 您应该在问题中包含有问题的字符串。
  • 你不应该转义 Z。hh 是错误的(它适用于 12h 格式)。您需要使用 HH (00-23)。并将您的格式化程序区域设置为"en_US_POSIX"。你应该检查这个stackoverflow.com/questions/28016578/…

标签: json swift macos dateformatter


【解决方案1】:

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

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

【讨论】:

  • 嗨,大卫 - 感谢您的回复。我尝试从代码中删除该行,但仍然收到错误消息。当我按照您的建议进行操作并选择澳大利亚或英国作为区域(代替“系统”设置)时,我仍然会遇到相同的错误 - 无论我选择哪个区域设置,这似乎仍然会发生。当两台机器都设置为相同的特定语言环境时 - 与我原来的问题中描述的结果相同。
【解决方案2】:

感谢所有回复的人。

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

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

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

【讨论】:

  • 并且不要在格式中引用“Z”。一旦你解决了这个问题,你就不再需要设置格式化程序的timeZone
  • 如果他希望它也为 +0000,则在返回 String 的路上需要时区。否则,正如 rmaddy 所说,只是不要将时区设置为使用当前时区
  • 感谢额外的 cmets。仅供参考 - 原始字符串中的“Z”包含在我正在解析的 JSON 对象中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2021-03-27
  • 2021-07-03
相关资源
最近更新 更多