Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use SwiftyJSON to deserialize NSDate

What is the best way to deserialize a JSON date into an NSDate instance using SwiftyJSON?

Is it to just use stringValue with NSDateFormatter or is there a built in date API method with SwiftyJSON?

like image 430
Marcus Leon Avatar asked Dec 05 '22 00:12

Marcus Leon


2 Answers

It sounds like NSDate support isn't built in to SwiftyJSON, but you can extend the JSON class with your own convenience accessors.

The following code is adapted from this GitHub issue.

extension JSON {
    public var date: NSDate? {
        get {
            if let str = self.string {
                return JSON.jsonDateFormatter.dateFromString(str)
            }
            return nil
        }
    }

    private static let jsonDateFormatter: NSDateFormatter = {
        let fmt = NSDateFormatter()
        fmt.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        fmt.timeZone = NSTimeZone(forSecondsFromGMT: 0)
        return fmt
    }()
}

Example:

let j = JSON(data: "{\"abc\":\"2016-04-23T02:02:16.797Z\"}".dataUsingEncoding(NSUTF8StringEncoding)!)

print(j["abc"].date)  // prints Optional(2016-04-23 02:02:16 +0000)

You might need to tweak the date formatter for your own data; see this question for more examples. Also see this question about date formatting in JSON.

like image 182
jtbandes Avatar answered Jan 05 '23 00:01

jtbandes


Swift 3 Version

extension JSON {
    public var date: Date? {
        get {
            if let str = self.string {
                return JSON.jsonDateFormatter.date(from: str)
            }
            return nil
        }
    }

    private static let jsonDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
        dateFormatter.timeZone = TimeZone.autoupdatingCurrent
        return dateFormatter
    }()
}
like image 39
dbergman Avatar answered Jan 04 '23 23:01

dbergman