将 JSON(日期)解析为 Swift
Parsing JSON (date) to Swift
我在 Swift 的申请中有一个 return JSON,并且有一个 return 给我约会的字段。当我引用此数据时,代码会给我类似“/ Date (1420420409680) /”的信息。我如何将其转换为 NSDate?在 Swift 中,拜托,我用 Objective-C 测试了示例,但没有成功。
它看起来像一个 UNIX 时间戳:01/12/2015 @6:14pm(UTC)[根据 http://www.unixtimestamp.com/index.php]
您可以使用构造函数 NSDate(timeIntervalSince1970: unixTimestamp) 将其转换为 NSDate 对象
这看起来与 Microsoft ASP.NET AJAX 使用的日期编码 JSON 非常相似,后者
在 An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET:
中描述
For example, Microsoft's ASP.NET AJAX uses neither of the described
conventions. Rather, it encodes .NET DateTime values as a JSON string,
where the content of the string is /Date(ticks)/ and where ticks
represents milliseconds since epoch (UTC). So November 29, 1989,
4:55:30 AM, in UTC is encoded as "\/Date(628318530718)\/".
唯一的区别是你的格式是 /Date(ticks)/
而不是 \/Date(ticks)\/
.
您必须提取括号之间的数字。将其除以 1000
给出自 1970 年 1 月 1 日以来的秒数。
下面的代码展示了如何做到这一点。它被实现为
"failable convenience initializer" 对于 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")
}
添加其他人提供的内容,只需在下面的 class 中创建实用程序方法:
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
}
然后你可以在你成功返回,解析的 JSON 对象中调用这个方法,如下所示:
//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)
那应该行得通!
我在 Swift 的申请中有一个 return JSON,并且有一个 return 给我约会的字段。当我引用此数据时,代码会给我类似“/ Date (1420420409680) /”的信息。我如何将其转换为 NSDate?在 Swift 中,拜托,我用 Objective-C 测试了示例,但没有成功。
它看起来像一个 UNIX 时间戳:01/12/2015 @6:14pm(UTC)[根据 http://www.unixtimestamp.com/index.php]
您可以使用构造函数 NSDate(timeIntervalSince1970: unixTimestamp) 将其转换为 NSDate 对象
这看起来与 Microsoft ASP.NET AJAX 使用的日期编码 JSON 非常相似,后者 在 An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET:
中描述For example, Microsoft's ASP.NET AJAX uses neither of the described conventions. Rather, it encodes .NET DateTime values as a JSON string, where the content of the string is /Date(ticks)/ and where ticks represents milliseconds since epoch (UTC). So November 29, 1989, 4:55:30 AM, in UTC is encoded as "\/Date(628318530718)\/".
唯一的区别是你的格式是 /Date(ticks)/
而不是 \/Date(ticks)\/
.
您必须提取括号之间的数字。将其除以 1000 给出自 1970 年 1 月 1 日以来的秒数。
下面的代码展示了如何做到这一点。它被实现为
"failable convenience initializer" 对于 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")
}
添加其他人提供的内容,只需在下面的 class 中创建实用程序方法:
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
}
然后你可以在你成功返回,解析的 JSON 对象中调用这个方法,如下所示:
//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)
那应该行得通!