簡體   English   中英

為什么JSON.stringify搞砸了我的日期時間對象?

[英]Why does JSON.stringify screw up my datetime object?

{ id: 1533,
  story_type_id: 1,
  content_id: 470,
  created_at: Sun, 05 Feb 2012 07:02:43 GMT,
  updated_at: Sun, 05 Feb 2012 07:02:43 GMT,
  type_name: 'post' }

我有一個帶有“datetime”字段的JSON對象,如上所示。 這是完美的。 但是當我對其進行字符串化(我想將其存儲在緩存中)時,我得到以下格式:

"created_at":"2012-02-05T07:02:43.000Z"

這會導致問題,因為當我想要JSON.parse時,它突然不再是日期時間格式,而且與我的其他格式不兼容。

我該怎么做才能解決這個問題? 在我的應用程序中,我的'created_at'遍布各處。 我不想手動更改每一個。

實際上可以修改Date對象如何序列化為JSON。 結合reviver功能,可以創建一個雙向解決方案,該解決方案將自動處理序列化,並且可以輕松地用於反序列化。

首先像這樣修改序列化:

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }

這會將Date對象的表示形式更改為帶有前綴作為標記的UNIX時間戳:

> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"

然后你可以創建一個reviver函數,它會自動過濾掉這些值:

function json_deserialize_helper(key,value) {
  if ( typeof value === 'string' ) {
    var regexp;
    regexp = /^{timestamp}(\d*)$/.exec(value);
    if ( regexp ) {
      return new Date(+regexp[1]);
    }
  }
  return value;
}

(信用:此代碼基本上是從相關問題的答案中復制而來的: https//stackoverflow.com/a/14509447/2572897

現在使用此設置,從之前反序列化我們的結果將再次導致Date對象:

> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}

或者您可以選擇不修改序列化,而是使用正則表達式來捕獲標准序列化格式:

function json_deserialize_helper(key,value) {
  if ( typeof value === 'string' ) {
    var regexp;
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value);
    if ( regexp ) {
      return new Date(value);
    }
  }
  return value;
}

例:

> json = JSON.stringify({test:new Date()})
"{"test":"2013-09-26T03:05:26.563Z"}"
> JSON.parse(json, json_deserialize_helper)
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)}

沒有特殊的方法來在JSON中序列化Date對象。 這就是你獲得標准化字符串表示的原因。 您需要通過將它們傳遞給Date構造函數將它們轉換回Date對象。

item['created_at'] = new Date(item['created_at']);

更新:使用reviver功能(請參閱注釋),您可以返回Date對象。

var item = JSON.parse(row, function (key, value) {
  if (key === 'created_at') {
    return new Date(value);
  } else {
    return value;
  }
});

Date.prototype.toJSON = function(){return moment(this).format('L'); }

您可以閱讀有關時刻文檔的更多信息,並定制您想要返回的日期類型。

var date = new Date();
console.log(date);//Mon Jun 11 2018 10:14:33 GMT+0430 (Iran Daylight Time)
var json = JSON.stringify(date);
console.log(json);//"2018-06-11T05:44:33.590Z"
var dateStr = JSON.parse(json);  
console.log(dateStr);//2018-06-11T05:44:33.590Z
var date = new Date(dateStr);
console.log(date);//Mon Jun 11 2018 10:14:33 GMT+0430 (Iran Daylight Time)

https://weblog.west-wind.com/posts/2014/Jan/06/JavaScript-JSON-Date-Parsing-and-real-Dates

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM