使用 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","repdate":"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 来格式化日期