ISO8601DateFormatter doesn't parse ISO date string

前端 未结 4 962
长情又很酷
长情又很酷 2020-12-17 07:40

I\'m trying to parse this

2017-01-23T10:12:31.484Z

using native ISO8601DateFormatter class provided by iOS 1

4条回答
  •  执念已碎
    2020-12-17 08:23

    Maybe this will help to decode slightly different formats:

    extension JSONDecoder {
        enum DateDecodeError: String, Error {
            case invalidDate
        }
    
        static var bestDateAttemptDecoder: JSONDecoder {
            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
                let container = try decoder.singleValueContainer()
                if let dateSecs = try? container.decode(Double.self) {
                    return Date(timeIntervalSince1970: dateSecs)
                }
    
                if let dateSecs = try? container.decode(UInt.self) {
                    return Date(timeIntervalSince1970: TimeInterval(dateSecs))
                }
    
                let dateStr = try container.decode(String.self)
                let isoFormatter = ISO8601DateFormatter()
                isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
                if let date = isoFormatter.date(from: dateStr) {
                    return date
                }
    
                isoFormatter.formatOptions = [.withInternetDateTime ]
                if let date = isoFormatter.date(from: dateStr) {
                    return date
                }
    
                log.warning("Cannot decode date");
                throw DateDecodeError.invalidDate
            })
    
            return decoder
        }
    }
    

    From: https://gist.github.com/th3m477/442a0d1da6354dd3b84e3b71df5dca6a

提交回复
热议问题