Am'am văzut atât de multe standarde diferite pentru JSON format dată:
"\"\\/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
Care este cel corect? Sau cel mai bine? Nu există nici un fel de standard în acest sens?
JSON în sine nu specificați ce date ar trebui să fie reprezentate, dar JavaScript nu.
Ai trebui să utilizeze formatul emis de Data
's toJSON
metoda:
2012-04-23T18:25:43.511 Z
Aici's de ce:
L's lizibil, dar, de asemenea, succint
Este felul corect
Acesta include fracționată de secunde, care poate ajuta la re-stabili cronologia
Se conformează la ISO 8601
ISO 8601 a fost bine stabilit la nivel internațional pentru mai mult de un deceniu
Acestea fiind spuse, de fiecare data bibliotecă scrisă vreodată poate înțelege "milisecunde din 1970". Deci, pentru portabilitate ușoară, ThiefMaster este dreapta.
JSON nu știu nimic despre date. Ce .NET nu este un non-standard hack/extensie.
Mi-ar folosi un format care poate fi ușor transformată într-o "Data" obiect în JavaScript, adică una care poate fi trecut la nou Data(...)
. Cel mai simplu și, probabil, cel mai portabil format este timestamp conțin milisecunde din 1970.
Nu există nici un drept format; A JSON caietul de sarcini nu specifica un format pentru schimbul de date, care este de ce există atât de multe moduri diferite de a face asta.
Cel mai bun format este, fără îndoială, o data reprezentate în ISO 8601 format (vezi Wikipedia); este un bine cunoscut și utilizat pe scară largă format și pot fi manipulate în multe limbi diferite, făcându-l foarte bine potrivite pentru interoperabilitate. Dacă aveți controlul asupra generate json, de exemplu, să furnizeze date și alte sisteme, în format json, alegerea 8601 ca data interchange format este o alegere bună.
Dacă nu aveți control asupra generate json, de exemplu, nu sunt consumator de json de la mai multe sisteme existente, cel mai bun mod de manipulare acest lucru este de a avea o întâlnire de analiză funcția de utilitate să se ocupe de diferite formate de așteptat.
De RFC 7493 (I-JSON Format de Mesaj ):
I-JSON standuri pentru Internet JSON sau Interoperabile JSON, depinde pe cine întrebi.
Protocoale conțin adesea elemente de date, care sunt concepute pentru a conține marcajele de timp sau durate. Este RECOMANDAT ca toate aceste date elemente să fie exprimate ca valori șir în formatul ISO 8601, după cum se specifică în RFC-3339, cu restricții suplimentare care majuscule, mai degrabă decât litere mici fi folosit, că de fus orar fi inclus nu implicit, și că, opțional, la final de secunde fi inclus chiar și atunci când valoarea lor este "00". Este RECOMANDAT, de asemenea, că toate pozițiile de date conține durate sunt conforme cu "durata" de producție în Anexa a RFC-3339, cu aceleași restricții suplimentare.
Doar pentru referință, am'am văzut acest format folosit:
Date.UTC(2017,2,22)
Acesta funcționează cu JSONP care este susținută de `$.getJSON () funcția. Nu sunt sigur că ar merge atât de departe încât să vă recomandăm această abordare... doar a aruncat-o acolo ca o posibilitate pentru oameni de a face în acest mod.
FWIW: nu utilizați Niciodată secunde de epocă într-un protocol de comunicare, nici milisecunde din epocă, deoarece acestea sunt un real pericol datorită randomizat implementarea salt de secunde (nu ai nici o idee dacă expeditorul și destinatarul pună în aplicare în mod corespunzător UTC salt de secunde).
Un fel de ură animal de companie, dar mulți oameni cred că este UTC doar noul nume pentru GMT-greșit! Dacă sistemul dumneavoastră nu pună în aplicare un salt de secunde, apoi utilizați GMT (adesea numit UTC, în ciuda fiind incorecte). Dacă nu pune în aplicare pe deplin salt de secunde chiar folosesc UTC. Viitorul salt de secunde nu poate fi cunoscut; ei primesc publicat de IER după cum este necesar și necesită actualizări constante. Dacă se execută un sistem care încearcă să pună în aplicare un salt de secunde, dar conține și out-of-data de referință de masă (mai frecvente decât s-ar putea crede), atunci nu ai nici GMT, nici UTC, ai o razna sistemul pretinde să fie UTC.
Aceste data contoare sunt compatibile doar atunci când sunt exprimate într-un defalcate format (y, m, d, etc). Ele NU sunt compatibile într-o epocă format. Ține minte asta.
Atunci când în dubiu, pur și simplu du-te la javascript consola web de un browser modern de activități prin apăsarea F12 (Ctrl+K în Firefox) și scrie următoarele:
new Date().toISOString()
Va ieșire:
"2019-07-04T13:33:03.969 Z"
Ta-da!!
JSON în sine nu are nici o data format, nu-i pasă cum cineva stochează datele. Cu toate acestea, deoarece această întrebare este etichetat cu javascript, presupun că vrei să știi cum de a stoca javascript date în JSON. Puteți trece doar o data la JSON.stringify
metodă, și se va folosi Data.prototip.toJSON
în mod implicit, care se transformă într-o folosește pentru Data.prototip.toISOString` (MDN pe Data.toJSON):
const json = JSON.stringify(new Date()); const analizat = JSON.analiza(json); //2015-10-26T07:46:36.611 Z const data = new Date(analizat); // Întoarce la obiect de data
Am găsit, de asemenea, este util de a folosi împrospătarea
parametru de JSON.analiza
(MDN pe JSON.analiza) pentru a converti automat ISO siruri de caractere înapoi la javascript date ori de câte ori am citit JSON siruri de caractere.
`` const isoDatePattern = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+([+-][0-2]\d:[0-5]\d|Z)/);
const obj = { o: 'foo', b: noua Data(1500000000000) // Fri Jul 14 2017, etc... } const json = JSON.stringify(obj);
// Converti înapoi, utilizați împrospătarea funcția: const analizat = JSON.analiza(json, (cheie, valoare) => { if (typeof valoare === 'string' && valoare.meci(isoDatePattern)){ întoarcere nou Data(valoare); // isostring, așa că a aruncat la js data } valoarea de retur; // lasă orice altă valoare ca-este }); console.log(analizat.b); // // Fri Jul 14 2017, etc... ``
Cred că cel mai bun format pentru universal de interoperabilitate nu este ISO-8601 șir, ci mai degrabă formatul folosit de EJSON:
{ "myDateField": { "$data" : <ms-de-epoca> } }
După cum este descris aici: https://docs.meteor.com/api/ejson.html
Beneficii
Concluzie
Am înțeles că un om poate fi citit în format (ISO-8601 string) este de ajutor și mai mult convenabil pentru 80% de cazuri de utilizare, și într-adevăr nimeni nu ar fi spus nu pentru a stoca datele lor ca ISO-8601 siruri de caractere, dacă asta's ce cererile lor să înțeleagă, dar pentru un universal acceptate de transport format care ar trebui să asigure anumite valori pentru a sigur fi date, cum poate ne-am permite pentru ambiguitate și au nevoie de atât de mult de validare?
De preferat este utilizarea 2018-04-23T18:25:43.511 Z
...
Imaginea de mai jos arată de ce este preferat de drum:
Deci, după cum vedeți Data are o Metodă nativă toJSON
, care "întoarcere" în acest format și pot fi ușor convertite la "Data" din nou...
În Sharepoint 2013, obținerea de date în JSON nu există nici un format pentru a converti data în data format numai, pentru că în acea dată ar trebui să fie în format ISO
yourDate.substring(0,10)
Acest lucru poate fi de ajutor pentru tine
este de lucru pentru mine, cu analiza Server
{
"ContractID": "203-17-DC0101-00003-10011",
"Supplier":"Sample Co., Ltd",
"Value":12345.80,
"Curency":"USD",
"StartDate": {
"__type": "Date",
"iso": "2017-08-22T06:11:00.000Z"
}
}
Există un singur răspuns corect pentru aceasta și cele mai multe sisteme greșit. Numărul de milisecunde de epocă, aka un 64 bit integer. Fus Orar este o UI îngrijorare și nu are afaceri în stratul de aplicație sau db strat. De ce nu-ți db pasă ce fusul orar este ceva, când știi că's de gând să depozitați-l ca un 64 bit integer apoi face calcule de transformare.
Benzi străine biți și tratează datele ca numere până la UI. Puteți utiliza simplu operatorii aritmetici pentru a face interogări și logica.
Următorul cod a lucrat pentru mine. Acest cod va imprima data în ZZ-LL-AAAA format.
DateValue=DateValue.substring(6,8)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(0,4);
altfel, puteți utiliza, de asemenea:
DateValue=DateValue.substring(0,4)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(6,8);
Cred că într-adevăr depinde de caz de utilizare. În multe cazuri ar putea fi mai benefic pentru a utiliza un obiect adecvat de model (în loc de randare data la un șir de caractere), astfel:
{
"person" :
{
"name" : {
"first": "Tom",
"middle": "M",
...
}
"dob" : {
"year": 2012,
"month": 4,
"day": 23,
"hour": 18,
"minute": 25,
"second": 43,
"timeZone": "America/New_York"
}
}
}
Desigur, acest lucru este mult mai detaliată decât RFC-3339 dar:
Data.toJSON()
nu't)Eu nu't cred că sortare corectă (după cum sa menționat de către funroll pentru RFC-3339) este o caracteristică care's cu adevărat necesar atunci când se înseriază o data la JSON. De asemenea, ca's doar valabil pentru data-ori având aceeași diferența de fus orar.