在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()中获得),我怎么得到它?
希望重写原型。
有人知道吗?
谢谢
答案 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));
这不是最干净的东西,但是其中包含行为改变的范围。