我在我的Swift应用程序中使用了一个返回JSON,并且其中有一个字段返回了一个日期。当我引用此数据时,代码给我返回一个类似于“/Date(1420420409680)/”这样的东西。我该如何将其转换为NSDate?请使用Swift进行操作,我已经尝试过Objective-C的示例,但没有成功。
我在我的Swift应用程序中使用了一个返回JSON,并且其中有一个字段返回了一个日期。当我引用此数据时,代码给我返回一个类似于“/Date(1420420409680)/”这样的东西。我该如何将其转换为NSDate?请使用Swift进行操作,我已经尝试过Objective-C的示例,但没有成功。
看起来非常类似于Microsoft的ASP.NET AJAX使用的日期JSON编码,该编码在JavaScript和.NET中介绍了JavaScript对象表示法(JSON)的入门:
例如,Microsoft的ASP.NET AJAX不使用描述的任何一种约定。相反,它将.NET DateTime值编码为JSON字符串,其中字符串的内容为/Date (ticks)/,而ticks表示自纪元(UTC)以来的毫秒数。因此,1989年11月29日上午4点55分30秒(UTC)被编码为“\/Date (628318530718)\/”。
唯一的区别是您有格式/Date(ticks)/
而不是\/Date(ticks)\/
。
您必须提取括号内的数字。将该数字除以1000即可得到自1970年1月1日以来的秒数。
以下代码显示了如何执行此操作。它作为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
}
}
}
示例用法 (使用您的日期字符串):
if let theDate = NSDate(jsonDate: "/Date(1420420409680)/") {
print(theDate)
} else {
print("wrong format")
}
这将输出
2015-01-05 01:13:29 +0000
针对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)
}
}
示例:
if let theDate = Date(jsonDate: "/Date(1420420409680)/") {
print(theDate)
} else {
print("wrong format")
}
func dateFromStringConverter(date: String)-> NSDate? {
//Create Date Formatter
let dateFormatter = NSDateFormatter()
//Specify Format of String to Parse
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" //or you can use "yyyy-MM-dd'T'HH:mm:ssX"
//Parse into NSDate
let dateFromString : NSDate = dateFormatter.dateFromString(date)!
return dateFromString
}
//Parse the date
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? String else {return}
YourClassModel.dateTakenProperty = self.dateFromStringConverter(datePhotoWasTaken)
或者您可以完全忽略上面的实用程序方法和调用者代码,直接执行以下操作:
//Parse the date
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? NSString else {return}
YourClassModel.dateTakenProperty = NSDate(timeIntervalSince1970: datePhotoWasTaken.doubleValue)
那应该可以工作!
"/Date(1420420409680)/"
的字符串。 - Martin R看起来像 UNIX 时间戳:01/12/2015 @ 6:14pm (UTC) [根据 http://www.unixtimestamp.com/index.php ]
您可以使用构造函数 NSDate(timeIntervalSince1970: unixTimestamp) 将其转换为 NSDate 对象。