2015-01-12 41 views
6

Tôi có một JSON trả về trong ứng dụng của mình trong Swift và có một trường trả về cho tôi một ngày. Khi tôi tham khảo dữ liệu này, mã cho tôi một cái gì đó như "/ Ngày (1420420409680) /". Làm thế nào để chuyển đổi nó thành NSDate? Trong Swift, xin vui lòng, tôi đã thử nghiệm các ví dụ với Objective-C, mà không thành công.Phân tích cú pháp JSON (ngày) thành Swift

+1

Xem http://stackoverflow.com/questions/26844132/làm thế nào để chuyển đổi-unix-timestamp-thành-swift-nsdate-đối tượng – rmaddy

+0

Đó là một dấu thời gian UNIX cũ đồng bằng. –

+0

@HotLicks: ... chỉ trong mili giây (hoặc nó sẽ là trong năm 46981 :) –

Trả lời

9

Điều đó có vẻ rất giống với mã hóa JSON cho một ngày như được sử dụng bởi Microsoft ASP.NET AJAX, mà được mô tả trong An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET:

Ví dụ, Microsoft ASP.NET AJAX sử dụng không phải của desc sườn quy ước. Thay vào đó, nó mã hóa các giá trị DateTime của .NET dưới dạng một chuỗi JSON, nơi nội dung của chuỗi là/Date (tick)/và nơi các dấu tích đại diện cho mili giây từ epoch (UTC). Vì vậy, ngày 29 tháng 11 năm 1989, 4:55:30 SA, trong UTC được mã hóa là "\/Ngày (628318530718) \ /".

Sự khác biệt duy nhất là bạn phải định dạng /Date(ticks)/ và không \/Date(ticks)\/.

Bạn phải trích xuất số giữa các dấu ngoặc đơn. Phân chia điều đó theo 1000 cho số sau vài giây kể từ ngày 1 tháng 1 năm 1970.

Mã sau đây cho thấy cách thực hiện. Nó được thực hiện như một "initializer tiện failable" cho 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 
     } 
    } 
} 

sử dụng Ví dụ (với chuỗi ngày của bạn):

if let theDate = NSDate(jsonDate: "/Date(1420420409680)/") { 
    print(theDate) 
} else { 
    print("wrong format") 
} 

này cung cấp cho các đầu ra

 
2015-01-05 01:13:29 +0000 

Cập nhật cho 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) 
    } 
} 

Ví dụ:

if let theDate = Date(jsonDate: "/Date(1420420409680)/") { 
    print(theDate) 
} else { 
    print("wrong format") 
} 
+0

@Martin phần mở rộng này không thành công cho một giá trị như: "/ Date (1479119050805 + 0300) /" vì phương thức init đôi mili giây không thể trả về giá trị gấp đôi cho giá trị 1479119050805 + 0300 do dấu cộng, nếu bạn quản lý để xử lý trường hợp này, vui lòng chia sẻ mã của bạn tại đây – JAHelia

+1

@JAHelia: Hãy xem http://stackoverflow.com/a/33166980/1187415 để có phiên bản mới hơn đọc ngày JSON có hoặc không có bù đắp múi giờ. –

+1

@Martin thật tuyệt vời, nhờ phần mở rộng thú vị – JAHelia

1

Nó trông giống như một UNIX Timestamp: 2015/01/12 @ 06:14 (UTC) [Theo http://www.unixtimestamp.com/index.php]

Bạn có thể chuyển nó sang một đối tượng NSDate sử dụng constructor NSDate (timeIntervalSince1970: unixTimestamp)

+0

Và làm thế nào tôi nhận được khoảng thời gian của biến này? –

2

Thêm vào những gì người khác đã cung cấp, chỉ cần tạo phương pháp hữu ích trong lớp học của bạn dưới đây:

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 
} 

Sau đó, bạn có thể gọi phương pháp này trong thành công của bạn đối tượng JSON được phân tích cú pháp trả về, như sau:

//Parse the date 
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? String else {return} 
    YourClassModel.dateTakenProperty = self.dateFromStringConverter(datePhotoWasTaken) 

Hoặc bạn có thể bỏ qua những phương pháp hữu ích và mã gọi trên hoàn toàn và chỉ cần làm điều này:

//Parse the date 
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? NSString else {return} 
    YourClassModel.dateTakenProperty = NSDate(timeIntervalSince1970: datePhotoWasTaken.doubleValue) 

Và đó nên làm việc!

+0

Câu hỏi đặt ra là phân tích cú pháp một chuỗi như '"/Date (1420420409680)/"' –

1

Đối với Chuyển đổi JSON String để Ngày & Time in Swift 3.0 Sử dụng Dưới đây Code: -

let timeinterval : TimeInterval = (checkInTime as! NSString).doubleValue 
let dateFromServer = NSDate(timeIntervalSince1970:timeinterval) 
print(dateFromServer) 
let dateFormater : DateFormatter = DateFormatter() 
//dateFormater.dateFormat = "dd-MMM-yyyy HH:mm a" // 22-Sep-2017 14:53 PM 
dateFormater.dateFormat = "dd-MMM-yyyy hh:mm a" // 22-Sep-2017 02:53 PM 
print(dateFormater.string(from: dateFromServer as Date)) 

nơi checkInTimewill được String.Hope của bạn nó sẽ giúp một ai đó

+0

Câu hỏi đặt ra là phân tích cú pháp một chuỗi như '"/Date (1420420409680)/"' –

Các vấn đề liên quan