日期格式化程序在解码 JSON 时返回有效字符串的 nil



我正在尝试解码 Swift 中2019-11-08T01:26:45+00:00格式的日期。不确定这是否相关,但它是从 JSON 中获取的字符串。我尝试使用ISO8601DateFormatter,手动设置日期格式等,但没有任何效果。 (response.timestamp的值为"2019-11-12T21:37:39+00:00",取自 JSON。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
dateFormatter.locale = Locale.current
self.timestamp = dateFormatter.date(from: response.timestamp)

当我构建并运行应用程序并在初始化date后设置断点时,该值始终nil

关键观察是确保您使用en_US_POSIX作为locale,如使用固定格式日期表示中所述:

let string = "2019-11-12T21:37:39+00:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let date = dateFormatter.date(from: string)

值得注意的是,虽然此格式化程序将使用+00:00成功解释日期字符串,但如果您将日期转换回字符串,它将使用 ISO 8601/RFC 3339 日期中常见的文字Z,例如"2019-11-12T21:37:39Z".如果您确实希望生成的字符串(如果要将日期转换为字符串)使用+00:00约定,则需要使用xxxxx而不是ZZZZZ。您还需要为格式化程序指定一个timeZone

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxxx"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let string = dateFormatter.string(from: date)            // "2019-11-12T21:37:39+00:00"

因此,如果您想要标准"2019-11-12T21:37:39Z",请使用ZZZZZ,但如果您想要"2019-11-12T21:37:39+00:00",请使用xxxxx


顺便说一下,有关ZZZZZZXxxxxx等所有不同排列的更多信息,请参阅日期格式模式表中的时区部分。


当我构建并运行应用程序并在初始化日期后设置断点时,该值始终nil

顺便说一下,始终print(或POlldb)值。有时,Xcode 中的检查器窗口会不同步,并在确实存在一些值时显示nil


正如 jms 所说,如果您使用的是JSONDecoder,您可能根本不应该使用date(from:)string(from:)。将属性设置为Date类型,然后为解码器提供dateDecodingStrategy

let json = """
{"date" : "2019-11-12T21:37:39+00:00"}
"""
let data = json.data(using: .utf8)!
struct ResponseObject: Codable {
let date: Date
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
do {
let object = try decoder.decode(ResponseObject.self, from: data)
} catch {
print(error)
}
func convertDateString(dateString:String,dateFormat:String = "") -> String {
if dateString.isEmpty {
return "" 
}
let dateFormatter = DateFormatter()
let tempLocale = dateFormatter.locale // save locale temporarily
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX en_US_POSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+s:s"
let date = dateFormatter.date(from: dateString)!
dateFormatter.dateFormat = dateFormat.isEmpty ? "dd-MM-yyyy" : dateFormat
dateFormatter.locale = tempLocale // reset the locale
let dateStr = dateFormatter.string(from: date)
return dateStr
}

使用情况- 字符串格式的 API 响应日期

let time1 = "2019-11-08T01:26:45+00:00"
print(convertDateString(dateString: time1,dateFormat: "EEEE, MMM d, yyyy"))

输出--->>>2019年11月8日星期五

最新更新