使用 Swift Decode 协议格式化日期

Posted

技术标签:

【中文标题】使用 Swift Decode 协议格式化日期【英文标题】:Date formatting with Swift Decode protocol 【发布时间】:2019-02-14 11:19:28 【问题描述】:

我正在尝试通过 Alamofire 将 JSON 中的日期转换为 Swift 4 中的结构。我设置了一个与 JSON 格式匹配的日期格式化程序,但出现错误:Date string does not match format expected by formatter

我正在使用以下代码:

struct AgentEvent: Decodable 
    let callref: Int?
    let repdate: Date?
    let parked: Bool?
    let company: String?


let decoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(dateFormatter)

self.events = try! decoder.decode([AgentEvent].self, from: data!)

使用的示例 JSON(在浏览器中运行方法时确认)是:

"callref":142,
"company":"Test Company Ltd",
"repdate":"2019-01-25T17:21:00",...

我已经对代码设置了断点,以准确查看我要解码的数据(以防它在某处被翻译),并且正在传入日期格式,它是: “2019-01-25T17:21:00”据我所知,格式确实与格式化程序中的预期格式匹配。我看不出这里有什么问题?

【问题讨论】:

请显示完整的实际 JSON。 不确定这将有什么帮助,因为它正在更新失败,但是:["callref":142,"company":"Test Company Ltd","re​​pdate":"2019-01 -25T17:21:00","attended":"2019-01-25T17:21:00","calltype":15,"status":1,"summary":"测试另一个新事件,以获取组织价值" ,"finflag":null,"parked":false,"Prioritized":false,"Agent_Id":2,"AgentGroup_Id":null,"IsRecurring":0, 我从字面上复制然后将您的代码和 JSON 粘贴到 Playground 中,它会正确解析日期,并在控制台上将其打印为 Optional(2019-01-25 17:21:00 +0000) 将所有属性声明为可选项的目的是什么?您应该只从您的 json 中声明可能没有返回任何值的属性。 因为这条记录代表了一个事件的生命周期,所以大多数值可能在某一点或另一个点为空。 【参考方案1】:

原来 dateDecodingStrategy 似乎不喜欢使用我使用的日期格式。我不得不编写一个自定义初始化程序并在其中处理格式。

现在工作正常。

【讨论】:

以上是关于使用 Swift Decode 协议格式化日期的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 DateFormatter 和 TimeZone 来格式化日期

Swift coreData - 格式化日期并在谓词中使用它

swift中的日期格式错误

Swift日期格式化程序忽略月份

Swift中下一个可用日期的日期格式[重复]

Swift - 错误的日期格式(JSON .NET)