Comment utiliser JSON.parse reviver parameter to parse date string

Ma chaîne JSON contient un champ de date qui renvoie une telle valeur:

"2009-04-04T22:55:16.0000000-04:00" 

Je suis particulièrement intéressé à analyser uniquement le compartiment de date, pas le temps. J'ai essayé d'utiliser une fonction reviver, mais, de façon intéressante, la fonction Reviver n'est jamais invoquée! (Essayé sur Firefox)

Voici mon code pour accomplir cela:

 var Site = { ..... dateReviver: function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }, loadArticle: function(id) { .... proxy.getArticle(id, function(response) { var data = JSON.parse(response.result, Site.dateReviver); .... }); } }; 

JSON.parse dans loadArticle jamais dateReviver .

J'ai investi toute une journée, mais pas de chance! Quelqu'un pourrait-il m'aider?

  1. L'expression régulière s'attend à un fuseau horaire "Zulu" (caractère A 'Z' à la fin), tandis que l'échantillon de la chaîne date-heure affiche une fuseau horaire numérique ('-04: 00'). Le regex suivant acceptera les deux:

     /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/ 

    Si les chiffres du fuseau horaire ne sont pas zéro, vous pouvez réellement modifier la date après l'analyse et / ou la conversion en UTC pour respecter le fuseau horaire.

  2. Je peux voir dateReviver () être touché. Essayez ce qui suit dans un navigateur:

     <!-- saved from url=(0014)about:internet --> <html> <head> <script src="http://www.json.org/json2.js"></script> <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script> <script> $(function () { // a mock proxy to return some json to play with var proxy = { getArticle: function(id, foo) { foo({ result: '["2009-04-04T22:55:16.0000000-04:00"]' }); } }; // the origial Site object, with the fixed regex var Site = { dateReviver: function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }, loadArticle: function(id) { proxy.getArticle(id, function(response) { var data = JSON.parse(response.result, Site.dateReviver); // put the parsed JSON date on the page $("#output").html(data[0].toString()); }); } }; // try out our Site object Site.loadArticle(); }); </script> </head> <body> <div id="output"></div> </body> </html> 

    Je reçois ce qui suit dans le navigateur, ce qui indique l'analyse réussie:

     Sat Apr 4 15:55:16 PDT 2009 

L'extension du réglage des convertisseurs jQuery.ajax m'a bien fonctionné par défaut.

 "text json": jQuery.parseJSON 

à

 "text json": function (xmlValue) { var value = JSON.parse(xmlValue, Site.dateReviver); return value; } 

En utilisant TypeSript, ma solution est la suivante:

  export function parseWithDate(jsonString: string): any { var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/; // startswith: 2015-04-29T22:06:55 var resultObject = JSON.parse(jsonString,(key: any, value: any) => { if (typeof value == 'string' && (reDateDetect.exec(value))) { return new Date(value); } return value; }); return resultObject; } 

Le meilleur de tous les mondes 😉 Il utilise un datereviver anonyme, qui est appelé par JSON.parse sur chaque propriété. La logique reviver est de vérifier si la propriété est de type string et, dans l'affirmative, qu'il s'agisse du début d'une date … Si c'est une date, laissez New Date (value) faire l'analyse actuelle … all Les variations de fuseau horaire sont prises en charge de cette façon.

J'espère que cela aide!

L'utilisation de return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

N'ajuste pas la date de l'information du fuseau horaire, les -4:00 dans l'exemple.

Une alternative est de laisser Date () faire l'analyse pour vous:

 var dateReviver = function (key, value) { var a; if (typeof value === 'string') { a = Date.parse(value); if (a) { return new Date(a); } } return value; } 

Si le JSON avait été formaté avec JSON.stringify (), il aurait été en UTC (Z).

 function dateReviver (k,v) { var isnum = /^\d+$/.test(v); // Check if number since Date.parse(number) returns valid date if (isnum) { return v; } if (Date.parse(v)) { return new Date(Date.parse(v)); } return v; }