SWIFT 不一致的 DateFormatter 结果
SWIFT Inconsistent DateFormatter result
我正在使用字符串扩展函数来转换日期字符串。函数为:
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)
语句并返回为 "Error converting date".
我不知道发生了什么事。我试过删除 dateFormater.locale = Locale.current
,但没有任何区别。
相同的 JSON 对象会产生错误(即每次我 运行 文件时,都是相同的 JSON 对象产生 "Error converting date" 响应)。当我在文本编辑器中查看 JSON 对象文件时,JSON 对象似乎没有问题(我也在在线 JSON 对象格式化程序中确认了这一点,它读取JSON 对象正确。)
我还应该补充一点,我正在使用 SwiftyJSON 来解析 JSON 对象。
非常感谢收到的任何帮助或建议。
有没有办法让我的代码更健壮?任何人都可以建议为什么不同的机器可能会有所不同,因为应用程序数据文件 Xcode 和 MacOS 都是一样的。
您的错误来自这一行:dateFormater.locale = Locale.current
。您的两台机器可能设置为使用不同的语言环境。
在按住选项键的同时单击运行并检查两台机器上的应用程序区域设置是什么。
感谢所有回复的人。
阅读 Code Different 引用的文章并关注 David 提出的问题后,将以下几行添加到我的代码中:
dateFormater.calendar = Calendar(identifier: .iso8601)
dateFormater.locale = Locale(identifier: "en_US_POSIX")
dateFormater.timeZone = TimeZone(secondsFromGMT: 0)
代替“dateFormater.locale = Locale.current
”行。它现在可以完美运行,并且可以毫无问题地在设备之间切换。
我正在使用字符串扩展函数来转换日期字符串。函数为:
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)
语句并返回为 "Error converting date".
我不知道发生了什么事。我试过删除 dateFormater.locale = Locale.current
,但没有任何区别。
相同的 JSON 对象会产生错误(即每次我 运行 文件时,都是相同的 JSON 对象产生 "Error converting date" 响应)。当我在文本编辑器中查看 JSON 对象文件时,JSON 对象似乎没有问题(我也在在线 JSON 对象格式化程序中确认了这一点,它读取JSON 对象正确。)
我还应该补充一点,我正在使用 SwiftyJSON 来解析 JSON 对象。
非常感谢收到的任何帮助或建议。
有没有办法让我的代码更健壮?任何人都可以建议为什么不同的机器可能会有所不同,因为应用程序数据文件 Xcode 和 MacOS 都是一样的。
您的错误来自这一行:dateFormater.locale = Locale.current
。您的两台机器可能设置为使用不同的语言环境。
在按住选项键的同时单击运行并检查两台机器上的应用程序区域设置是什么。
感谢所有回复的人。
阅读 Code Different 引用的文章并关注 David 提出的问题后,将以下几行添加到我的代码中:
dateFormater.calendar = Calendar(identifier: .iso8601)
dateFormater.locale = Locale(identifier: "en_US_POSIX")
dateFormater.timeZone = TimeZone(secondsFromGMT: 0)
代替“dateFormater.locale = Locale.current
”行。它现在可以完美运行,并且可以毫无问题地在设备之间切换。