This is very similar to the JSON encoding for the date used by Microsoft ASP.NET AJAX, which is described in Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET :
For example, Microsoft ASP.NET AJAX does not use any of the conventions described. Rather, it encodes .NET DateTime values ββas a JSON string, where the content of the string is / Date (ticks) / and where ticks represent milliseconds from the era (UTC). So, on November 29, 1989, 4:55:30, in UTC it is encoded as "\ / Date (628318530718) \ /".
The only difference is that you have the format of /Date(ticks)/ and not \/Date(ticks)\/ .
You need to extract the number between parentheses. Dividing this by 1000 gives the number in seconds since January 1, 1970.
The following code shows how to do this. It is implemented as a "failed convenience initializer" for NSDate :
extension NSDate { convenience init?(jsonDate: String) { let prefix = "/Date(" let suffix = ")/" // Check for correct format: if jsonDate.hasPrefix(prefix) && jsonDate.hasSuffix(suffix) { // Extract the number as a string: let from = jsonDate.startIndex.advancedBy(prefix.characters.count) let to = jsonDate.endIndex.advancedBy(-suffix.characters.count) // Convert milliseconds to double guard let milliSeconds = Double(jsonDate[from ..< to]) else { return nil } // Create NSDate with this UNIX timestamp self.init(timeIntervalSince1970: milliSeconds/1000.0) } else { return nil } } }
Usage example (with your date string):
if let theDate = NSDate(jsonDate: "/Date(1420420409680)/") { print(theDate) } else { print("wrong format") }
It gives a way out
2015-01-05 01:13:29 +0000
Update for Swift 3 (Xcode 8):
extension Date { init?(jsonDate: String) { let prefix = "/Date(" let suffix = ")/" // Check for correct format: guard jsonDate.hasPrefix(prefix) && jsonDate.hasSuffix(suffix) else { return nil } // Extract the number as a string: let from = jsonDate.index(jsonDate.startIndex, offsetBy: prefix.characters.count) let to = jsonDate.index(jsonDate.endIndex, offsetBy: -suffix.characters.count) // Convert milliseconds to double guard let milliSeconds = Double(jsonDate[from ..< to]) else { return nil } // Create NSDate with this UNIX timestamp self.init(timeIntervalSince1970: milliSeconds/1000.0) } }
Example:
if let theDate = Date(jsonDate: "/Date(1420420409680)/") { print(theDate) } else { print("wrong format") }