我在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)\/。
/Date(ticks)/
\/Date(ticks)\/
您必须提取括号之间的数字。将其除以1000得到自1970年1月1日以来的秒数。
以下代码显示了如何完成此操作。它被实现为“失败的便利初始化程序”,用于NSDate:
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") }