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

标签 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 .
我找了另一个 friend 帮忙,他也不知道。

我怀疑日期字符串末尾的七位 float 是罪魁祸首,但我不知道如何解决这个问题。
也许我只是错过了一些非常小的东西。多一双眼睛就好了。

非常感谢大家的帮助,thanx。

我想我应该在解析的地方包含实际代码:

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

最佳答案

明白了。有时当您需要调试时,请使用 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 说我应该包括语言环境,所以我添加了它。感谢 Leo 的帮助!

关于json - 如何让 JSONDecoder 解析这种格式? (yyyy-MM-dd'T'HH :mm:ss. SSSSSSS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47533690/

相关文章:

ios - Swift这种情况用Core Data合适吗?

java - Java设置时区,同时将日期从山区转换为东部到格林尼治标准时间

php - 每个循环的php插入数据两次,而不是每行两次

ios - 动画期间错误的帧值

ios - 单击 Swift 按钮以显示带有工具栏 View 的键盘

java - 在GWT中将时间值格式化为HH:mm:ss.SS

c# - 如何检查 Java 中是否已经过了 X 秒?

javascript - 使用具有来自JSON的多个序列的Highcharts的图表

java - 使用jackson-mapper解析json文件错误

python - jq 或 python 脚本删除 json 字段中日期后的文本