Widziałem tak wiele różnych standardów formatu daty JSON:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
Który jest właściwy? A może najlepiej? Czy jest w tym jakiś standard?
javascript
json
Kamyar Nazeri
źródło
źródło
strings
,numbers
,true
,false
,null
,objects
Iarrays
Odpowiedzi:
Sam JSON nie określa sposobu reprezentacji dat, ale JavaScript.
Państwo powinno użyć formatu emitowanego przez
Date
„stoJSON
metody:2012-04-23T18:25:43.511Z
Dlatego:
Jest czytelny dla człowieka, ale także zwięzły
Sortuje się poprawnie
Zawiera ułamkowe sekundy, które mogą pomóc przywrócić chronologię
Jest zgodny z ISO 8601
ISO 8601 jest znana na całym świecie od ponad dekady
ISO 8601 jest zatwierdzony przez W3C , RFC3339 i XKCD
To powiedziawszy , każda napisana biblioteka dat może zrozumieć „milisekundy od 1970 roku”. Więc dla łatwego przenoszenia, ThiefMaster ma rację.
źródło
JSON.stringify({'now': new Date()}) "{"now":"2013-10-21T13:28:06.419Z"}"
-
pojawia się przed cyframiASCII
, wszystko będzie dobrze, aż do 100 000 roku. ; PJSON nic nie wie o datach. To, co robi .NET, to niestandardowy hack / rozszerzenie.
Użyłbym formatu, który można łatwo przekonwertować na
Date
obiekt w JavaScript, tj. Takiego, który można przekazaćnew Date(...)
. Najłatwiejszym i prawdopodobnie najbardziej przenośnym formatem jest znacznik czasu zawierający milisekundy od 1970 roku.źródło
Nie ma odpowiedniego formatu ; Specyfikacja JSON nie określa formatu wymiany dat, dlatego jest tak wiele różnych sposobów, aby to zrobić.
Najlepszym formatem jest prawdopodobnie data reprezentowana w formacie ISO 8601 ( patrz Wikipedia ); jest to dobrze znany i szeroko stosowany format, który można obsługiwać w wielu różnych językach, dzięki czemu doskonale nadaje się do współpracy. Jeśli na przykład kontrolujesz wygenerowany plik Json, udostępniasz dane innym systemom w formacie json, wybierając 8601 jako format wymiany daty, dobrym wyborem.
Jeśli na przykład nie masz kontroli nad wygenerowanym plikiem Json, jesteś konsumentem oprogramowania Json z kilku różnych istniejących systemów, najlepszym sposobem na to jest skorzystanie z funkcji narzędzia do analizy dat, która obsługuje różne oczekiwane formaty.
źródło
Z RFC 7493 (format wiadomości I-JSON) :
I-JSON oznacza Internet JSON lub Interoperable JSON, w zależności od tego, kogo zapytasz.
źródło
Date().toISOString()
iDate().toJSON()
, z ograniczeniem, któreDate
nie śledzi wartości strefy czasowej, a zatem zawsze emituje znaczniki czasu w strefie czasowej UTC (Z
). Wartość można przeanalizować za pomocąnew Date("...")
iDate.parseDate
.Tylko w celach informacyjnych widziałem używany format:
Działa z JSONP, który jest obsługiwany przez
$.getJSON()
funkcję. Nie jestem pewien, czy posunę się tak daleko, aby zalecić takie podejście ... po prostu wyrzucenie go jako możliwej możliwości, ponieważ ludzie robią to w ten sposób.FWIW: Nigdy nie używaj sekund od epoki w protokole komunikacyjnym ani milisekund od epoki, ponieważ są one obarczone niebezpieczeństwem dzięki losowej implementacji sekund przestępnych (nie masz pojęcia, czy nadawca i odbiorca poprawnie implementują sekundy przestępne UTC).
Nienawiść do zwierząt domowych, ale wiele osób uważa, że UTC to tylko nowa nazwa GMT - źle! Jeśli twój system nie implementuje sekund przestępnych, oznacza to, że korzystasz z GMT (często nazywany UTC, mimo że jest nieprawidłowy). Jeśli w pełni wykorzystasz sekundy przestępne, naprawdę używasz UTC. Przyszłe sekundy przestępne nie mogą być znane; są one publikowane przez IERS w razie potrzeby i wymagają ciągłych aktualizacji. Jeśli korzystasz z systemu, który próbuje zaimplementować sekundy przestępne, ale zawiera nieaktualną tabelę referencyjną (bardziej powszechną niż mogłoby się wydawać), to nie masz GMT ani UTC, masz dziwny system udający UTC.
Te liczniki daty są kompatybilne tylko wtedy, gdy są wyrażone w formacie z podziałem (y, m, d itp.). NIGDY nie są kompatybilne w formacie epoki. Miej to w pamięci.
źródło
W razie wątpliwości wystarczy przejść do konsoli internetowej javascript nowoczesnej przeglądarki, naciskając klawisz F12 (Ctrl + K w przeglądarce Firefox) i napisz:
Wyjdzie:
Ta-da !!
źródło
Uważam, że najlepszym formatem dla uniwersalnej interoperacyjności nie jest ciąg ISO-8601, ale format używany przez EJSON:
{ "myDateField": { "$date" : <ms-since-epoch> } }
Jak opisano tutaj: https://docs.meteor.com/api/ejson.html
Korzyści
Wniosek
Rozumiem, że format czytelny dla człowieka (ciąg ISO-8601) jest pomocny i wygodniejszy w 80% przypadków użycia, i w rzeczywistości nikt nie powinien być informowany, aby nie przechowywał swoich dat jako ciągów ISO-8601, jeśli takie są ich aplikacje rozumiemy, ale dla powszechnie przyjętego formatu transportu, który powinien gwarantować pewne wartości, na pewno daty, w jaki sposób możemy pozwolić na dwuznaczność i potrzebę tak dużej walidacji?
źródło
Sam JSON nie ma formatu daty, nie obchodzi go, jak ktokolwiek przechowuje daty. Ponieważ jednak pytanie to jest oznaczone javascript, zakładam, że chcesz wiedzieć, jak przechowywać daty javascript w JSON. Możesz po prostu podać datę do
JSON.stringify
metody, a ona użyjeDate.prototype.toJSON
domyślnie, która z kolei używaDate.prototype.toISOString
( MDN na Date.toJSON ):Uznałem również, że użyteczne jest użycie
reviver
parametruJSON.parse
( MDN na JSON.parse ) do automatycznej konwersji ciągów ISO z powrotem na daty javascript za każdym razem, gdy czytam ciągi JSON.źródło
Preferowanym sposobem jest użycie
2018-04-23T18:25:43.511Z
...Poniższy obrazek pokazuje, dlaczego jest to preferowany sposób:
Jak widać, Date ma natywną metodę
toJSON
, którąreturn
w tym formacie można łatwo przekonwertować naDate
jeszcze raz ...źródło
W Sharepoint 2013, pobieranie danych w JSON nie ma formatu do konwersji daty na format tylko daty, ponieważ w tej dacie powinien być format ISO
To może ci pomóc
źródło
„2014-01-01T23: 28: 56.782Z”
Data jest reprezentowana w standardowym i sortowalnym formacie, który reprezentuje czas UTC (wskazany przez Z). ISO 8601 obsługuje również strefy czasowe, zastępując Z wartością + lub - dla przesunięcia strefy czasowej:
„2014-02-01T09: 28: 56.321-10: 00”
Istnieją inne odmiany kodowania strefy czasowej w specyfikacji ISO 8601, ale format –10: 00 jest jedynym formatem TZ obsługiwanym przez obecne parsery JSON. Ogólnie najlepiej jest używać formatu opartego na UTC (Z), chyba że istnieje konkretna potrzeba ustalenia strefy czasowej, w której data została utworzona (możliwe tylko w przypadku generowania po stronie serwera).
NB: var date = new Date (); console.log (data); // śr. 01.01.2014 13:28:56 GMT- 1000 (hawajski czas standardowy)
aby powiedzieć, że jest to preferowany sposób, mimo że JavaScript nie ma standardowego formatu
źródło
Jeśli używasz Kotlin, to rozwiąże twój problem. (Format MS Json)
źródło
działa dla mnie z parsowaniem serwera
źródło
Jest tylko jedna poprawna odpowiedź na to pytanie i większość systemów źle ją rozumie. Liczba milisekund od epoki, czyli 64-bitowa liczba całkowita. Strefa czasowa jest problemem związanym z interfejsem użytkownika i nie ma działalności w warstwie aplikacji lub db. Dlaczego db ma dbałość o strefę czasową, skoro wiesz, że zapisze ją jako 64-bitową liczbę całkowitą, wykonaj obliczenia transformacji.
Usuń niepotrzebne fragmenty i traktuj daty jak liczby aż do interfejsu użytkownika. Za pomocą prostych operatorów arytmetycznych można wykonywać zapytania i logikę.
źródło
Poniższy kod działał dla mnie. Ten kod wydrukuje datę w formacie DD-MM-RRRR .
w przeciwnym razie możesz również użyć:
źródło
Myślę, że to naprawdę zależy od przypadku użycia. W wielu przypadkach korzystniejsze może być użycie odpowiedniego modelu obiektowego (zamiast renderowania daty w ciągu), na przykład:
Wprawdzie jest to bardziej szczegółowe niż RFC 3339, ale:
Date.toJSON()
nie)Nie sądzę, aby poprawne sortowanie (jak zauważył funroll dla RFC 3339) jest funkcją, która jest naprawdę potrzebna podczas szeregowania randki w JSON. Dotyczy to także dat i godzin mających takie same przesunięcie strefy czasowej.
źródło
post contains wrong information, is poorly researched, or fails to communicate information
. Wyjaśnij, z którego z tych powodów odmówiłeś swojej odpowiedzi.