【发布时间】:2017-11-28 14:14:31
【问题描述】:
这就是我要解码的内容:
{"MessageDate":"2017-11-28T05:04:40.9611765"}
我省略了 JSON 结构的其余部分。
我如何让JSONDecoder 将该日期格式解析为Date 对象?
这是我迄今为止尝试过的:
extension Formatter
{
static let dotNetDateTime: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
return formatter
}()
/// https://stackoverflow.com/a/46458771/8462094
static let dotNetDateTimeISO8601: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
return formatter
}()
/// https://stackoverflow.com/a/46458771/8462094
static let dotNetDateTimeISO8601NoMS: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
return formatter
}()
static let dotNetDateTimeCustom: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS"
return formatter
}()
static let iso8601Full: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
}
其中一些来自其他 Stack Overflow 帖子。
我还尝试了很多上面未列出的其他日期解码策略。
我已经在互联网上搜索了几个小时以寻找解决方案。
我看过Unicode documentation for date format patterns。
我求助了另一个朋友,他也不知道。
我怀疑日期字符串末尾的七位浮点数是罪魁祸首,但我不知道如何解决。
也许我只是错过了一些非常小的东西。再来一双眼睛就好了。
非常感谢任何帮助,谢谢。
我想我应该包含我正在解析的实际代码:
let attempt1 = JSONDecoder()
attempt1.dateDecodingStrategy = .formatted(Formatter.dotNetDateTime)
let attempt2 = JSONDecoder()
attempt2.dateDecodingStrategy = .formatted(Formatter.dotNetDateTimeISO8601)
//And more attempt initializations
...
print(String(data: data, encoding: .utf8)!)
if let deser = try? attempt1.decode(MessageThreads.self, from: data)
{
return onDone(deser, nil)
}
if let deser = try? attempt2.decode(MessageThreads.self, from: data)
{
return onDone(deser, nil)
}
//And more attempts
...
【问题讨论】:
标签: json swift datetime swift4