Swiftyjson: Date and Time

Created on 10 Dec 2015  路  11Comments  路  Source: SwiftyJSON/SwiftyJSON

Where is json["date"].date or json["time"].time?

Most helpful comment

You may use an extension like below,

extension JSON {

    public var date: NSDate? {
        get {
            switch self.type {
            case .String:
                return Formatter.jsonDateFormatter.dateFromString(self.object as! String)
            default:
                return nil
            }
        }
    }

    public var dateTime: NSDate? {
        get {
            switch self.type {
            case .String:
                return Formatter.jsonDateTimeFormatter.dateFromString(self.object as! String)
            default:
                return nil
            }
        }
    }

}

and initialize formatters depending on the data you may receive.

class Formatter {

    private static var internalJsonDateFormatter: NSDateFormatter?
    private static var internalJsonDateTimeFormatter: NSDateFormatter?

    static var jsonDateFormatter: NSDateFormatter {
        if (internalJsonDateFormatter == nil) {
            internalJsonDateFormatter = NSDateFormatter()
            internalJsonDateFormatter!.dateFormat = "yyyy-MM-dd"
        }
        return internalJsonDateFormatter!
    }

    static var jsonDateTimeFormatter: NSDateFormatter {
        if (internalJsonDateTimeFormatter == nil) {
            internalJsonDateTimeFormatter = NSDateFormatter()
            internalJsonDateTimeFormatter!.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"
        }
        return internalJsonDateTimeFormatter!
    }

}

All 11 comments

You may use an extension like below,

extension JSON {

    public var date: NSDate? {
        get {
            switch self.type {
            case .String:
                return Formatter.jsonDateFormatter.dateFromString(self.object as! String)
            default:
                return nil
            }
        }
    }

    public var dateTime: NSDate? {
        get {
            switch self.type {
            case .String:
                return Formatter.jsonDateTimeFormatter.dateFromString(self.object as! String)
            default:
                return nil
            }
        }
    }

}

and initialize formatters depending on the data you may receive.

class Formatter {

    private static var internalJsonDateFormatter: NSDateFormatter?
    private static var internalJsonDateTimeFormatter: NSDateFormatter?

    static var jsonDateFormatter: NSDateFormatter {
        if (internalJsonDateFormatter == nil) {
            internalJsonDateFormatter = NSDateFormatter()
            internalJsonDateFormatter!.dateFormat = "yyyy-MM-dd"
        }
        return internalJsonDateFormatter!
    }

    static var jsonDateTimeFormatter: NSDateFormatter {
        if (internalJsonDateTimeFormatter == nil) {
            internalJsonDateTimeFormatter = NSDateFormatter()
            internalJsonDateTimeFormatter!.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"
        }
        return internalJsonDateTimeFormatter!
    }

}

I like this answer, however I have a question. If the dateFormat I enter in the Formatter class doesn't match the json, will it not return anything?

For example, my json date is 2016-01-27T12:01:40.915-07:00 and my dateFormat is "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'-'xxx" but nothing is returned. Is that because my dateFormat is wrong, or do I have issues elsewhere?

My JSON format is same as yours and here is the format I used: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSSZZ"

@lmacfadyen Thanks very much, I will give that a try.

@lmacfadyen That worked. Thanks very much.

@rmoffett This issue should be closed.

It would be good to add locale setting on the NSDateFormatter to this, otherwise it may fail depending on device locale.

Thank you for this nice snippet, it saved me some time.

Here is the code updated for Swift3:

class Formatter {

    private static var internalJsonDateFormatter: DateFormatter?
    private static var internalJsonDateTimeFormatter: DateFormatter?

    static var jsonDateFormatter: DateFormatter {
        if (internalJsonDateFormatter == nil) {
            internalJsonDateFormatter = DateFormatter()
            internalJsonDateFormatter!.dateFormat = "yyyy-MM-dd"
        }
        return internalJsonDateFormatter!
    }

    static var jsonDateTimeFormatter: DateFormatter {
        if (internalJsonDateTimeFormatter == nil) {
            internalJsonDateTimeFormatter = DateFormatter()
            internalJsonDateTimeFormatter!.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"
        }
        return internalJsonDateTimeFormatter!
    }

}

extension JSON {

    public var date: Date? {
        get {
            switch self.type {
            case .string:
                return Formatter.jsonDateFormatter.date(from: self.object as! String)
            default:
                return nil
            }
        }
    }

    public var dateTime: Date? {
        get {
            switch self.type {
            case .string:
                return Formatter.jsonDateTimeFormatter.date(from: self.object as! String)
            default:
                return nil
            }
        }
    }

}

Formatter class can be reduced to:

class Formatter {
    static let jsonDateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()

    static let jsonDateTimeFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"
        return formatter
    }()
}

In iOS 10+

    static let jsonDateTimeFormatter: DateFormatter = ISO8601DateFormatter()

Is there a reason why this is not included? Will a PR be accepted?

I am using this with Outlook, and the dateTime doesn't send the milliseconds so the regex above will fail, I need to remove the SSS part and it worked.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Dershowitz011 picture Dershowitz011  路  15Comments

namanhams picture namanhams  路  16Comments

fahad-larasoft picture fahad-larasoft  路  11Comments

mlaster picture mlaster  路  17Comments

debayanb picture debayanb  路  12Comments