So verwenden Sie JSON.Parse Reviver Parameter, um die Datumszeichenfolge zu analysieren
-
22-09-2019 - |
Frage
Meine JSON -Zeichenfolge enthält ein Datumsfeld, das einen solchen Wert zurückgibt:
"2009-04-04T22:55:16.0000000-04:00"
Ich bin besonders daran interessiert, nur das Datumskompartiment zu analysieren, nicht die Zeit. Ich habe versucht, eine Reviver -Funktion zu verwenden, aber interessanterweise wird die Reviver -Funktion nie aufgerufen! (auf Firefox versucht)
Hier ist mein Code, um das zu erreichen:
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 IN loadArticle
ruft niemals an dateReviver
.
Ich habe einen ganzen Tag investiert, aber kein Glück! Könnte mir bitte jemand helfen?
Lösung
Der reguläre Ausdruck erwartet eine "Zulu" -Timezone (ein 'z'-Zeichen am Ende), während die Stichproben-Datumsstring eine numerische Zeitzone (' -04: 00 ') zeigt. Der folgende Regex akzeptiert beide:
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
Wenn die Zeitzonen -Ziffern nicht Null sind, möchten Sie möglicherweise das Datum nach der Parsen und/oder Konvertierung in UTC ändern, um die Zeitzone zu respektieren.
Ich kann sehen, dass DataReviver () getroffen wird. Probieren Sie Folgendes in einem Browser aus:
<!-- 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>
Ich bekomme das Folgende im Browser, was auf eine erfolgreiche Parsen hinweist:
Sat Apr 4 15:55:16 PDT 2009
Andere Tipps
Unter Verwendung von Typenript lautet meine Lösung wie folgt:
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;
}
Das Beste aller Welten ;-) Es verwendet ein anonymer DataeReviver, das von JSON.Parse auf jeder Eigenschaft aufgerufen wird. Die Reviver -Logik besteht darin, zu überprüfen, ob die Eigenschaft vom Typ Zeichenfolge ist und ob sie wie der Beginn eines Datums aussieht ... wenn es sich um ein Datum handelt, dann lassen Sie das neue Datum (Wert) das tatsächliche Parsen ... alle Timezone -Variationen werden auf diese Weise unterstützt.
Ich hoffe es hilft!
Die Erweiterung der Einstellung von jQuery.ajax -Konvertern hat für mich aus dem Standardeinsatz gut funktioniert:
"text json": jQuery.parseJSON
zu
"text json": function (xmlValue) {
var value = JSON.parse(xmlValue, Site.dateReviver);
return value;
}
Die Verwendung von return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
Passt das Datum für die Zeitzone -Informationen nicht an, die -4:00
Im Beispiel.
Eine Alternative besteht darin, Datum () das Parsen für Sie durchzuführen:
var dateReviver = function (key, value) {
var a;
if (typeof value === 'string') {
a = Date.parse(value);
if (a) {
return new Date(a);
}
}
return value;
}
Wenn der JSON mit JSON.Stringify () formatiert worden wäre, wäre es in UTC (Z) gewesen.
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;
}