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
Trả lời
Đ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")
}
@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
@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ờ. –
@Martin thật tuyệt vời, nhờ phần mở rộng thú vị – JAHelia
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)
Và làm thế nào tôi nhận được khoảng thời gian của biến này? –
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!
Câu hỏi đặt ra là phân tích cú pháp một chuỗi như '"/Date (1420420409680)/"' –
Đố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 đó
Câu hỏi đặt ra là phân tích cú pháp một chuỗi như '"/Date (1420420409680)/"' –
- 1. Phân tích cú pháp chính xác JSON trong Swift 3
- 2. Cách phân tích cú pháp JSON (AS3)
- 3. Ngày phân tích cú pháp trong Bash
- 4. Ngày phân tích cú pháp trong MySQL
- 5. Phân tích cú pháp một mảng JSON thành một NSDictionary
- 6. Phân tích cú pháp chuỗi JSON bị hình thành
- 7. Phân tích cú pháp JSON với Dart
- 8. Phân tích cú pháp cột Gấu trúc thành Ngày giờ
- 9. Phân tích cú pháp JSON trong Python
- 10. Phân tích cú pháp Json Windows8
- 11. JSONKit phân tích cú pháp chuỗi json
- 12. Phân tích cú pháp JSON trong Android
- 13. Lỗi phân tích cú pháp JSON
- 14. phân tích cú pháp json trong haskell
- 15. Hive: phân tích cú pháp JSON
- 16. phân tích cú pháp json python
- 17. Phân tích cú pháp JSON bằng YAML
- 18. Json phân tích cú pháp trong Ansible
- 19. Logstash không phân tích cú pháp json
- 20. Phân tích cú pháp thông tin ngày JSON thành C# DateTime
- 21. Cách phân tích cú pháp JSON được phân tích cú pháp để sử dụng ngoại tuyến
- 22. Kết hợp phân tích cú pháp phân tích cú pháp, phân tích cú pháp và phân tích cú pháp rừng
- 23. MongoDB + Java - phân tích cú pháp JSON qua com.mongodb.util.JSON.parse
- 24. Ngày phân tích cú pháp với Angular 4.3 HttpClient
- 25. GSON ném phân tích cú pháp trường trống Trường ngày
- 26. Rắc rối phân tích cú pháp JSON bằng Swift bằng SwiftyJSON
- 27. Phân tích cú pháp thành Nullable Enum
- 28. Chuỗi phân tích cú pháp thành TimeSpan
- 29. Chuỗi phân tích cú pháp thành Double.NaN
- 30. Phân tích cú pháp JSON dung sai lỗi
Xem http://stackoverflow.com/questions/26844132/làm thế nào để chuyển đổi-unix-timestamp-thành-swift-nsdate-đối tượng – rmaddy
Đó là một dấu thời gian UNIX cũ đồng bằng. –
@HotLicks: ... chỉ trong mili giây (hoặc nó sẽ là trong năm 46981 :) –