web-dev-qa-db-fra.com

Le "bon" format de date JSON

J'ai vu tellement de normes différentes pour le format de date 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

Lequel est le bon? Ou mieux? Y at-il une sorte de norme à ce sujet?

931
Kamyar Nazeri

JSON même pas spécifie comment les dates doivent être représentées, mais JavaScript le fait.

Vous devriez utiliser le format émis par Date 's toJSON method:

2012-04-23T18:25:43.511Z

Voici pourquoi:

  1. C'est lisible par l'homme mais aussi succinct

  2. Il trie correctement

  3. Il inclut des fractions de secondes qui peuvent aider à rétablir la chronologie

  4. Il est conforme à ISO 8601

  5. ISO 8601 est bien établie à l'échelle internationale depuis plus d'une décennie

  6. L'ISO 8601 est approuvée par W3C , RFC3339 , et XKCD

Cela étant dit, chaque bibliothèque de dates jamais écrite peut comprendre "millisecondes depuis 1970". Donc, pour une portabilité facile, ThiefMaster a raison.

1530
funroll

JSON ne sait rien des dates. Ce que fait NET est un hack/extension non standard.

J'utiliserais un format qui peut être facilement converti en un objet Date en JavaScript, c'est-à-dire qui peut être passé à new Date(...) . Le format le plus simple et probablement le plus portable est l’horodatage contenant des millisecondes depuis 1970.

108
ThiefMaster

Il n'y a pas de bon format; La SPÉCIFICATION JSON ne spécifie pas de format pour l'échange de dates, c'est pourquoi il y a tant de façons différentes de le faire.

Le meilleur format est sans doute une date représentée sous la forme de format ISO 8601 ( voir Wikipedia ); C'est un format bien connu et largement utilisé qui peut être utilisé dans de nombreuses langues, ce qui le rend parfaitement adapté à l'interopérabilité. Si vous avez le contrôle sur le JSON généré, par exemple, si vous fournissez des données à d'autres systèmes au format JSON, choisir 8601 comme format d'échange de date est un bon choix.

Si vous n'avez pas le contrôle sur le JSON généré, par exemple, si vous utilisez le JSON de plusieurs systèmes existants différents, le meilleur moyen de le gérer consiste à utiliser une fonction utilitaire d'analyse de date pour gérer les différents formats attendus.

34
Russ Cam

De RFC 7493 (format de message I-JSON) :

I-JSON signifie indifféremment JSON Internet ou JSON interopérable, selon le destinataire.

Les protocoles contiennent souvent des éléments de données conçus pour contenir horodatages ou durées. Il est RECOMMANDÉ que toutes ces données les éléments doivent être exprimés sous forme de valeurs de chaîne au format ISO 8601, comme spécifié in RFC 3339 , avec les restrictions supplémentaires qui majuscule plutôt que des lettres minuscules soient utilisées, que le fuseau horaire ne soit pas inclus par défaut, et que les secondes de fin facultatives soient incluses même lorsque leur valeur est "00". Il est également RECOMMANDÉ que tous les éléments de données contenant des durées conformes à la "durée" de production en Annexe A de la RFC 3339, avec les mêmes restrictions supplémentaires.

22
Bryan Larsen

Juste pour référence, j'ai vu ce format utilisé:

Date.UTC(2017,2,22)

Cela fonctionne avecJSONPqui est supporté par la fonction $.getJSON(). Je ne suis pas sûr que j'irais jusqu'à recommander cette approche ... il suffit de la jeter comme une possibilité, car les gens le font de cette façon.

FWIW: N'utilisez jamais des secondes depuis Epoch dans un protocole de communication, ni des millisecondes depuis Epoch, car elles sont dangereuses, grâce à la mise en œuvre aléatoire de secondes intercalaires (vous ne savez pas si l'expéditeur et le destinataire appliquent correctement les secondes intercalaires UTC ).

C'est un peu la haine des animaux domestiques, mais beaucoup de gens croient que UTC n'est que le nouveau nom de GMT - faux! Si votre système n'implémente pas les secondes intercalaires, vous utilisez GMT (souvent appelé UTC bien qu'il soit incorrect). Si vous implémentez pleinement les secondes intercalaires, vous utilisez réellement le temps UTC. Les secondes intercalaires futures ne peuvent pas être connues; ils sont publiés par l'IERS selon les besoins et nécessitent des mises à jour constantes. Si vous exécutez un système qui tente d'implémenter des secondes intercalaires, mais contient une table de référence obsolète (plus courante que vous ne le pensez), vous n'avez ni GMT, ni UTC, vous avez un système volumineux prétendant être UTC.

Ces compteurs de date ne sont compatibles que s’ils sont exprimés dans un format décomposé (y, m, d, etc.). Ils ne sont JAMAIS compatibles dans un format Epoch. Garde cela à l'esprit.

11
Tel

JSON lui-même n'a pas de format de date, peu importe la façon dont tout le monde stocke les dates. Cependant, cette question étant marquée avec javascript, je suppose que vous voulez savoir comment stocker les dates javascript dans JSON. Vous pouvez simplement passer une date à la méthode JSON.stringify, qui utilisera par défaut Date.prototype.toJSON, qui à son tour utilise Date.prototype.toISOString ( MDN le Date.toJSON ):

const json = JSON.stringify(new Date());
const parsed = JSON.parse(json); //2015-10-26T07:46:36.611Z
const date = new Date(parsed); // Back to date object

J'ai également trouvé utile d'utiliser le paramètre reviver de JSON.parse ( MDN sur JSON.parse ) pour convertir automatiquement les chaînes ISO en dates javascript à chaque fois que je lis des chaînes JSON.

const someObj = {
 a: 'foo',
 b: new Date()
}
const json = JSON.stringify(someObj);

const parsed = JSON.parse(json, (key, value) => {
    const isoDate = 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)/);

    if (typeof value === 'string' &&  value.match(isoDate)){
        return new Date(value); // isostring, so cast to js date
    }
    return value;
});
console.log(parsed.b); // Date object
3
Justus Romijn

En cas de doute, accédez simplement à la console Web javascript d'un navigateur moderne en appuyant sur F12 (Ctrl + K dans Firefox) et écrivez les informations suivantes:

new Date().toISOString()

Est-ce que la sortie:

"2019-07-04T13: 33: 03.969Z"

Ta-da !!

3
Shayan Ahmad

La méthode préférée consiste à utiliser 2018-04-23T18:25:43.511Z...

L'image ci-dessous montre pourquoi c'est la méthode préférée:

JSON Date

Donc, comme vous le voyez, Date a une méthode native toJSON, qui return dans ce format et qui peut être facilement convertie en Date à nouveau ...

1
Alireza

Dans Sharepoint 2013, l'obtention de données au format JSON ne comporte aucun format permettant de convertir une date au format date uniquement, car cette date doit être au format ISO

yourDate.substring(0,10)

Cela peut être utile pour vous

0
raghava arr