将JSON(日期)解析为Swift

时间:2015-01-12 18:12:08

标签: ios json parsing swift

我在Swift中的应用程序中返回了JSON,并且有一个字段可以返回给我一个日期。当我参考这些数据时,代码给了我类似“/ Date(1420420409680)/”的内容。如何将其转换为NSDate?在Swift中,我已经使用Objective-C测试了一些示例,但没有成功。

3 个答案:

答案 0 :(得分:9)

这看起来非常类似于Microsoft ASP.NET AJAX使用的日期的JSON编码 在An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET中描述:

  

例如,Microsoft的ASP.NET AJAX没有使用上述任何一种   约定。相反,它将.NET DateTime值编码为JSON字符串,   其中字符串的内容是/ Date(ticks)/和ticks   表示自纪元(UTC)以来的毫秒数。所以1989年11月29日,   4:55:30 AM,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")
}

答案 1 :(得分:1)

添加其他人提供的内容,只需在下面的班级中创建实用工具方法:

  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)

这应该有效!

答案 2 :(得分:0)

它看起来像UNIX时间戳:2015年12月1日下午6:14(UTC)[根据http://www.unixtimestamp.com/index.php]

您可以使用构造函数NSDate(timeIntervalSince1970:unixTimestamp)将其转换为NSDate对象