如何以这种日期格式使用 JSONDecoder / Codable?

Posted

技术标签:

【中文标题】如何以这种日期格式使用 JSONDecoder / Codable?【英文标题】:How can I use JSONDecoder / Codable with this date format? 【发布时间】:2019-03-23 17:15:51 【问题描述】:

我从 API 得到以下日期。


  "createdDate": "2019-03-22T15:53:06.663Z"

我想对此进行解码并将其存储为 Date 类型。

但我的JSONDecoder 无法解码。

我尝试用

来扩展它
extension DateFormatter 
    static let iso8601Full: DateFormatter = 
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    ()

然后使用decoder.dateDecodingStrategy = .formatted(DateFormatter.iso8601Full) 但这不起作用

【问题讨论】:

你得到了什么输出? 什么不起作用?实际上JSONDecoder 对于具有一个键值对的字典来说有点矫枉过正。 我只包括相关的道具,还有很多。 日期格式化程序对于给定的 ISO8601 字符串是正确的。 【参考方案1】:

ISO8601DateFormatter 与格式选项一起使用

let str = "2019-03-22T15:53:06.663Z"
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withFullDate, .withFullTime, .withTimeZone, .withFractionalSeconds]
let date = formatter.date(from: str)

【讨论】:

或简单地[.withInternetDateTime, .withFractionalSeconds]。顺便说一句,您不能将 ISO8601DateFormatter 与dateDecodingStrategy 一起使用。您需要创建自定义日期解码策略。 ***.com/questions/28016578/…

以上是关于如何以这种日期格式使用 JSONDecoder / Codable?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSONDecoder 解码古怪的日期格式

具有多种日期格式的 JSONDecoder?

如何处理 JSONDecoder 中的空日期字符串

如何使用 jsonDecoder 处理来自 JSON 响应的动态键?

你如何以这种格式显示日期? “2018 年 7 月 18 日上午 10:02”

如何准备 API 响应以在 swift 中与 jsonDecoder 一起使用