簡體   English   中英

幾乎是ISO8601格式

[英]Almost iSO8601 format

我需要在 JSON 有效載荷中解析以下日期,它幾乎是 ISO8601 格式。

"2020-06-05 14:52:54 UTC"

為了符合 ISO8601,它需要稍作改動。

"2020-06-05T14:52:54Z"

這非常煩人,因為我現在必須制定客戶日期解碼策略。

static func make() -> JSONDecoder {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
//        decoder.dateDecodingStrategy = .iso8601
    decoder.dateDecodingStrategy = .custom({ decoder in
        let container = try decoder.singleValueContainer()
        let dateStr = try container.decode(String.self)
        guard let date = formatter.date(from: dateStr) else {
            preconditionFailure("Unexpected date format.")
        }
        return date
    })
    return decoder
}

我無法控制數據源。 在這種情況下,我能做些什么來避免自定義解碼策略嗎?

由於您似乎只想使用DateFormatter來解析日期字符串,因此請使用formatted策略。

let formatter = DateFormatter()

formatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzzz" 
// or 
// formatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'UTC'"
// formatter.timeZone = .init(identifier: "UTC")

formatter.locale = Locale(identifier: "en_US_POSIX")
decoder.dateDecodingStrategy = .formatted(formatter)

Sweeper 答案的替代方法是編寫DateFormatter的擴展

extension DateFormatter {
    static let almostISO8601Formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
        return formatter
    }()
}

然后你的make() function 就變成了

static func make() -> JSONDecoder {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    decoder.dateDecodingStrategy = .formatted(.almostISO8601Formatter)
    return decoder
}

還考慮將make() (具有更有意義的名稱)放在JSONDecoder的擴展中

您可以將map 輸入到 iso8601,以使用現有的解碼器:

func iso8601ify(_ str: String) -> String {
    str.split(separator: " ")
        .prefix(2)
        .joined(separator: "T")
        .appending("Z")
}

這個例子,當然沒有錯誤處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM