我正在尝试使用codable
将json响应解码为模型,但是在解析日期时遇到了麻烦。
在DateFormatter
中使用的im格式为"yyyy-MM-dd'T'HH:mmZ"
和数据样本
{
"startDate": "2019-01-27T00:00:00",
"endDate": "2019-02-02T00:00:00",
"id": null
}, {
"startDate": "2019-01-20T00:00:00",
"endDate": "2019-01-26T00:00:00",
"id": null
}, {
"startDate": "2019-01-13T00:00:00",
"endDate": "2019-01-19T00:00:00",
"id": null
}, {
"startDate": "2019-01-13T00:00:00",
"endDate": "2020-01-19T00:00:00",
"id": null
}, {
"startDate": "2019-01-06T00:00:00",
"endDate": "2019-01-12T00:00:00",
"id": null
}
我还尝试过"yyyy-MM-dd'T'HH:mmZ"
周围有"yyyy-MM-dd'T'HH:mm:ssZ"
的{{1}},"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
和'
我得到的错误是
“ NSCodingPath”:[CodingKeys(stringValue:“ result”,intValue:nil),_JSONKey(stringValue:“ Index 0”,intValue:0),CodingKeys(stringValue:“ startDate”,intValue:nil)],“ NSDebugDescription“:”日期字符串与格式化程序期望的格式不匹配。“
我确定格式正确,但是该错误使我怀疑自己的理智。
我从https://nsdateformatter.com/那里获得了格式
答案 0 :(得分:1)
它是yyyy-MM-dd'T'HH:mm:ss
。您的字符串有秒数(因此包括:ss
),但是没有毫秒(即不包括.SSS
)和时区限定符(即也不包括Z
)。
对我来说有趣的问题是它应该采用哪个时区。默认情况下,即使字符串中没有时区部分,DateFormatter
也会采用本地时区,即使很有可能是GMT / UTC / Zulu。如果是这样,请显式设置格式化程序的timeZone
。而且,当然,不要忘记设置locale
。
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0) // include this only if dates are GMT/UTC/Zulu
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
如果需要,您还可以使用ISO8601DateFormatter
(假设UTC / GMT),
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withFullDate, .withTime, .withColonSeparatorInTime]
在这种情况下,如果要使用本地时区,则必须指定该时间:
formatter.timeZone = .current
很遗憾,使用dateDecodingStrategy
不能使用ISO8601DateFormatter
。同样,.iso8601
策略假定您具有时区字符。
因此,使用Codable
和您的特定字符串,您必须坚持上面的DateFormatter
示例。
答案 1 :(得分:-1)
Z
格式说明符是不必要的,因为日期字符串不包含时区偏移。