json.parse Reviverパラメーターを使用して日付文字列を解析する方法
-
22-09-2019 - |
質問
私のJSON文字列には、そのような値を返す日付フィールドが含まれています。
"2009-04-04T22:55:16.0000000-04:00"
私は特に時間ではなく日付コンパートメントのみを解析することに興味があります。私はリバイバー関数を使用しようとしましたが、興味深いことに、リバイバー関数が呼び出されることはありません! (Firefoxで試した)
これを達成するための私のコードは次のとおりです。
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
決して電話しないでください dateReviver
.
私は一日を投資しましたが、運はありません!誰かが私を助けてくれませんか?
解決
正規表現は「Zulu」タイムゾーン(最後に「Z」文字)を期待し、サンプルの日付文字列には数値タイムゾーン( '-04:00')が表示されます。次の正規表現は両方を受け入れます。
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
タイムゾーンの数字がゼロでない場合は、タイムゾーンを尊重するために、解析および/またはUTCに変換した後の日付を実際に変更することをお勧めします。
Datereviver()がヒットしていることがわかります。ブラウザで以下を試してください。
<!-- 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>
ブラウザで以下を取得しており、解析が成功したことを示しています。
Sat Apr 4 15:55:16 PDT 2009
他のヒント
TypeRiptを使用して、私のソリューションは次のとおりです。
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;
}
すべての世界のベスト;-)それは、各プロパティでjson.parseによって呼び出される匿名のDatereviverを使用します。 Reviverロジックは、プロパティが型文字列であるかどうか、もしそうなら、日付の開始のように見えるかどうかを確認することです...日付の場合は、新しい日付(値)に実際の解析を行います...すべてタイムゾーンのバリエーションはそのようにサポートされています。
それが役に立てば幸い!
jquery.ajaxコンバーターの設定を拡張すると、そのデフォルトから私にとっては正常に動作します。
"text json": jQuery.parseJSON
に
"text json": function (xmlValue) {
var value = JSON.parse(xmlValue, Site.dateReviver);
return value;
}
の用法 return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
タイムゾーン情報の日付を調整しません、 -4:00
例で。
別の方法は、日付()にあなたのために解析を行わせることです。
var dateReviver = function (key, value) {
var a;
if (typeof value === 'string') {
a = Date.parse(value);
if (a) {
return new Date(a);
}
}
return value;
}
JSONがjson.stringify()でフォーマットされていた場合、それは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;
}