如何通过字符串化使Date对象的toString在JavaScript中使用常规toString而不是toStringISO?

时间:2019-05-27 20:34:09

标签: javascript

在javascript中,当我通过JSON.stringify将Date对象转换为字符串时,默认情况下它使用toStringISO。如何更改它的原型,使其使用基本的toString?

我有

var f = new Date("Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time)");

然后,如果我执行JSON.stringify(f),它会给我"2019-05-28T00:11:13.000Z"

但是我希望它给我"Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time)"(我可以从f.toString()中获得),我怎么得到它?

希望重写原型。

有人知道吗?

谢谢

3 个答案:

答案 0 :(得分:2)

documentation for JSON.stringify这样说:

  
      
  • 如果该值具有toJSON()方法,则负责定义将序列化哪些数据。
  •   
     

...

     
      
  • Date的实例通过返回字符串(与toJSON()相同)来实现date.toISOString()函数。因此,它们被视为字符串。
  •   

如果您想更改每个日期的序列化方式,则可以覆盖Date.toJSON

Date.prototype.toJSON = function() { return this.toString() }

通过替换该方法,现在每个日期都将使用Date.toString进行序列化:

var f = new Date(2019, 2, 3);
JSON.stringify(f)

无论日期嵌套在JSON结构中有多深,它都将起作用,将对每个日期起作用,并且不需要对执行序列化的方式进行任何自定义。上面显示的JSON.stringify(f)调用可能是您已经使用过的。

如果您想更改特定日期的序列化方式,只需替换该Date对象的toJSON方法:

var f = new Date(2019, 2, 3);
g = new Date();
f.toJSON = function() { return this.toString() };
JSON.stringify([f,g])

哪个提供了此JSON:

"["Sun Mar 03 2019 00:00:00 GMT-0600 (Central Standard Time)","2019-05-27T20:56:51.335Z"]"

答案 1 :(得分:0)

您可以使用以下功能自定义JSON.stringify

JSON.stringify(objectToStringify, function (key, value) {
  if (value instanceof Date) {
    return (new Date(value)).toString(); // Or whatever you want to serialize it to
  }
  return value;
});

答案 2 :(得分:0)

JSON.stringify具有替换值的功能。不幸的是,Date.prototype.toJSON在它之前被调用了。如果您要避免直​​接更改原型并且不能包装/更改日期对象本身,则可以通过父对象绕过它:

function replacer(key, value) {
    return typeof value === 'string' && this[key] instanceof Date ?
        String(this[key]) :
        value;
}

console.log(JSON.stringify({
    foo: 'bar',
    baz: new Date("Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time)"),
}, replacer));

这不是最干净的东西,但是其中包含行为改变的范围。