如何让JSONDecoder解析这种格式? (YYYY-MM-dd'T'HH:MM:ss.SSSSSSS)

时间:2017-11-28 14:14:32

标签: json swift datetime swift4

这就是我想要解码的内容:

{"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
...

1 个答案:

答案 0 :(得分:2)

知道了。有时,当您需要调试时,请使用Playgrounds。

extension Formatter
{
    static let dotNetDateTimeWithMilliseconds: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.S"
        return formatter
    }()
}

只需一个.S即可解析它。

编辑:
@Leo Dabus说我应该包含语言环境,所以我把它添加进来.Thanx Leo为你提供帮助!