此日期时间响应的正确格式是什么

时间:2019-02-04 23:33:57

标签: ios swift date codable

我正在尝试使用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/那里获得了格式

2 个答案:

答案 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格式说明符是不必要的,因为日期字符串不包含时区偏移。