В javascript, когда я конвертирую объект Date в строку через JSON.stringify, он по умолчанию использует 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()), как мне это получить?
Хотите переопределить прототип, что-то в этом роде.
Кто-нибудь знает?
Спасибо
Date
имеет toJSON
метод, который JSON.stringify
вызывает сериализацию объекта в JSON. Возможно, вы могли бы заменить toJSON
своим собственным методом.
Возможный дубликат Как правильно указать даты с часовыми поясами в javascript?
Вы можете настроить 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;
});
документация для JSON.stringify
говорит следующее:
- If the value has a
toJSON()
method, it's responsible to define what data will be serialized....
- The instances of
Date
implement thetoJSON()
function by returning a string (the same asdate.toISOString()
). Thus, they are treated as strings.
Если вы хотите изменить сериализацию каждой даты, вы можете переопределить 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"]"
JSON.stringify
принимает функцию для замены значений. К сожалению, Date.prototype.toJSON
вызывается раньше. Если вы хотите избежать прямого изменения прототипа и не можете обернуть/изменить сами объекты даты, вы можете обойти это через родителя:
function replacer(key, value) {
return typeof value === 'string' && this[key] instanceof Date ?
String(this[key]) :
value;
}
console.info(JSON.stringify({
foo: 'bar',
baz: new Date("Mon May 27 2019 20:11:13 GMT-0400 (Eastern Daylight Time)"),
}, replacer));
Не самая чистая вещь, но как бы содержит масштаб измененного поведения.
«К сожалению, Date.prototype.toJSON вызывается перед ним». Вы можете просто return (new Date(value)).toString();
@ritaj: Если у вас есть смешанные типы значений, вы не можете знать, была ли строка изначально датой.
Почему вы не можете просто использовать JSON.stringify(f.toString())?