ISO8601DateFormatter doesn't parse ISO date string

前端 未结 4 960
长情又很酷
长情又很酷 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:19

    I encountered same issue some months ago. And here's my solution for reference:

    // *****************************************
    // MARK: - Formatter extension
    // *****************************************
    extension Formatter {
        static let iso8601: ISO8601DateFormatter = {
            let formatter = ISO8601DateFormatter()
            formatter.timeZone = TimeZone.current 
            formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
            return formatter
        }()
        static let iso8601NoSecond: ISO8601DateFormatter = {
            let formatter = ISO8601DateFormatter()
            formatter.timeZone = TimeZone.current 
            formatter.formatOptions = [.withInternetDateTime]
            return formatter
        }()
    }
    
    // *****************************************
    // MARK: - ISO8601 helper
    // *****************************************
        func getDateFrom(DateString8601 dateString:String) -> Date?
        {
            if let date = Formatter.iso8601.date(from: dateString)  {
                return date
            }
            if let date = Formatter.iso8601NoSecond.date(from: dateString)  {
                return date
            }
            return nil
        }
    
    // *****************************************
    // usage
    // *****************************************
        let d = getDateFrom(DateString8601: "2017-01-23T10:12:31.484Z")
        print("2017-01-23T10:12:31.484Z millis= ", d?.timeIntervalSinceReferenceDate)
    
        let d2 = getDateFrom(DateString8601: "2017-01-23T10:12:31Z")
        print("2017-01-23T10:12:31Z millis= ", d2?.timeIntervalSinceReferenceDate)
    
    
    // *****************************************
    // result
    // *****************************************
    2017-01-23T10:12:31.484Z millis=  Optional(506859151.48399997)
    2017-01-23T10:12:31Z millis=  Optional(506859151.0)
    

提交回复
热议问题