Mam zwrot JSON w mojej aplikacji w Swift i pole, które zwraca mi datę. Kiedy odwołuję się do tych danych, kod daje mi coś w stylu "/ Date (1420420409680) /". Jak przekonwertować to na NSDate? W Swift, proszę, przetestowałem przykłady z Objective-C, bez powodzenia.Parsowanie JSON (data) do Swift
Odpowiedz
który wygląda bardzo podobnie do kodowania JSON na randkę jak używany przez Microsoft ASP.NET AJAX, który jest opisany w An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET:
na przykład, ASP.NET AJAX Microsoftu korzysta ani z desc żebrowane konwencje . Zamiast tego koduje wartości .NET DateTime jako ciąg JSON, , gdzie treść ciągu to/Date (ticks)/i gdzie ticks reprezentuje milisekundy od epoki (UTC). 29 listopada 1989, 4:55:30, w UTC jest zakodowany jako "\/Date (628318530718) \ /".
Jedyną różnicą jest to, że mają format /Date(ticks)/
i nie \/Date(ticks)\/
.
Musisz wyodrębnić liczbę z nawiasów. Podzielenie tego przez 1000 podaje liczbę w sekundach od 1 stycznia 1970.
Poniższy kod pokazuje, jak można to zrobić. Jest on realizowany jako na "failable wygody inicjatora" dla 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
}
}
}
Przykład użycia (z datą ciąg):
if let theDate = NSDate(jsonDate: "/Date(1420420409680)/") {
print(theDate)
} else {
print("wrong format")
}
Daje wyjście
2015-01-05 01:13:29 +0000
Aktualizacja dla 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)
}
}
Przykład:
if let theDate = Date(jsonDate: "/Date(1420420409680)/") {
print(theDate)
} else {
print("wrong format")
}
@Martin to rozszerzenie kończy się niepowodzeniem dla wartości typu: "/ Date (1479119050805 + 0300) /" ponieważ metoda Double init o milisekundach nie może zwrócić podwójnego dla wartości 1479119050805 + 0300 ze względu na znak plusa, jeśli uda ci się obsłużyć w tym przypadku prosimy o udostępnienie kodu tutaj – JAHelia
@JAHelia: Zajrzyj na http://stackoverflow.com/a/33166980/1187415 dla nowszej wersji, która czyta daty JSON z lub bez przesunięcia strefy czasowej. –
@Martin, który jest niesamowity, dzięki za fajne rozszerzenie – JAHelia
To wygląda jak uniksowy znacznik czasu: 12.01.2015 @ 6:14 pm (UTC) [Zgodnie http://www.unixtimestamp.com/index.php]
można przekonwertować go do obiektu NSDate pomocą konstruktora NSDate (timeIntervalSince1970: unixTimestamp)
A jak dostaję czas na tę zmienną? –
Dodanie na co inni pod warunkiem, wystarczy utworzyć metodę użytkowej w klasie poniżej:
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
}
Następnie można wywołać tej metody w swojej powodzeniem wrócił, parsował obiekt JSON, jak poniżej:
//Parse the date
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? String else {return}
YourClassModel.dateTakenProperty = self.dateFromStringConverter(datePhotoWasTaken)
Albo można zignorować metodę użytkową oraz kod rozmówcy powyżej całkowicie i po prostu to zrobić:
//Parse the date
guard let datePhotoWasTaken = itemDictionary["date_taken"] as? NSString else {return}
YourClassModel.dateTakenProperty = NSDate(timeIntervalSince1970: datePhotoWasTaken.doubleValue)
I to powinno działać!
Pytanie dotyczy parsowania łańcucha takiego jak '"/Date (1420420409680)/"' –
do konwersji JSON
String na bieżąco & Czas Swift 3.0
Korzystanie poniższy kod: -
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))
gdzie checkInTimewill
być Twój String.Hope pomoże ktoś
Pytanie dotyczy parsowania ciągu typu '"/Date (1420420409680)/"' –
- 1. Data JSON do daty Java?
- 2. parsowanie json python
- 3. Parsowanie JSON przy użyciu nowych Swift 3 i Alamofire
- 4. Parsowanie i generowanie JSON
- 5. Parsowanie JSON z Dart
- 6. AS3 JSON parsowanie
- 7. Parsowanie JSON z GSON
- 8. Parsowanie Json Windows8
- 9. Parsowanie dużego pliku JSON
- 10. Parsowanie JSON w J2ME
- 11. Parsowanie tablicy JSON w obiekty?
- 12. Parsowanie JSON z XmlHttpRequest.responseJSON
- 13. Parsowanie obiektów json
- 14. Parsowanie JSON do tablicy w skrypcie powłoki
- 15. Eliksir - Zagnieżdżone parsowanie JSON do struktur
- 16. parsowanie zagnieżdżonych zbiorów json do kolekcji szkieletowych
- 17. parsowanie xml w iOS swift
- 18. Formatowanie Swift Data
- 19. Parsowanie JSON z żądania webhook
- 20. Parsowanie JSON bez cytowanych kluczy
- 21. Parsowanie pliku json z gsonem
- 22. Jak testować jednostkę JSON parsowanie
- 23. AngularJS Display JSON Data
- 24. swift 3 Postój parametru json do api
- 25. JavaScript JSON Data Deserialization
- 26. Bezpieczne parsowanie łańcucha JSON z niecytowanymi kluczami
- 27. Parsowanie tablicy zakodowanej w JSON przez perl
- 28. Parsowanie złożonych obiektów json z TypeScript
- 29. Data JSON z tweetera do formatu C#
- 30. swift 3.0 Data to String?
Zobacz http://stackoverflow.com/questions/26844132/how-to-convert-unix-timestamp-to-swift-nsdate-object – rmaddy
Jest to zwykły stary znacznik czasu UNIX. –
@HotLicks: ... tylko w milisekundach (lub byłoby to w roku 46981 :) –