问题描述
我有一个以下格式的字符串
I have a String in following format
"/Date(573465600000-0800)/"
如何将其转换为常规 NSDate 对象?
How do I convert this to regular NSDate object?
推荐答案
第一部分573465600000"是Unix纪元以来的时间以毫秒为单位,第二部分-0800"是时区规范.
The first part "573465600000" is the time since the Unix epoch in milliseconds, and the second part "-0800" is a time zone specification.
这里是将JSON(日期)解析为Swift的小改动这也涵盖了时区部分:
Here is a slight modification of Parsing JSON (date) to Swift which also covers the time zone part:
extension NSDate { convenience init?(jsonDate: String) { let prefix = "/Date(" let suffix = ")/" let scanner = NSScanner(string: jsonDate) // Check prefix: if scanner.scanString(prefix, intoString: nil) { // Read milliseconds part: var milliseconds : Int64 = 0 if scanner.scanLongLong(&milliseconds) { // Milliseconds to seconds: var timeStamp = NSTimeInterval(milliseconds)/1000.0 // Read optional timezone part: var timeZoneOffset : Int = 0 if scanner.scanInteger(&timeZoneOffset) { let hours = timeZoneOffset / 100 let minutes = timeZoneOffset % 100 // Adjust timestamp according to timezone: timeStamp += NSTimeInterval(3600 * hours + 60 * minutes) } // Check suffix: if scanner.scanString(suffix, intoString: nil) { // Success! Create NSDate and return. self.init(timeIntervalSince1970: timeStamp) return } } } // Wrong format, return nil. (The compiler requires us to // do an initialization first.) self.init(timeIntervalSince1970: 0) return nil } }
例子:
if let theDate = NSDate(jsonDate: "/Date(573465600000-0800)/") { println(theDate) } else { println("wrong format") }
输出:
1988-03-04 00:00:00 +0000
<小时>
Swift 3 (Xcode 8) 更新:
extension Date { init?(jsonDate: String) { let prefix = "/Date(" let suffix = ")/" let scanner = Scanner(string: jsonDate) // Check prefix: guard scanner.scanString(prefix, into: nil) else { return nil } // Read milliseconds part: var milliseconds : Int64 = 0 guard scanner.scanInt64(&milliseconds) else { return nil } // Milliseconds to seconds: var timeStamp = TimeInterval(milliseconds)/1000.0 // Read optional timezone part: var timeZoneOffset : Int = 0 if scanner.scanInt(&timeZoneOffset) { let hours = timeZoneOffset / 100 let minutes = timeZoneOffset % 100 // Adjust timestamp according to timezone: timeStamp += TimeInterval(3600 * hours + 60 * minutes) } // Check suffix: guard scanner.scanString(suffix, into: nil) else { return nil } // Success! Create NSDate and return. self.init(timeIntervalSince1970: timeStamp) } }
例子:
if let theDate = Date(jsonDate: "/Date(573465600000-0800)/") { print(theDate) } else { print("wrong format") }