Как заставить объект Date toString через stringify использовать обычный toString вместо toStringISO в javascript?

В 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()), как мне это получить?

Хотите переопределить прототип, что-то в этом роде.

Кто-нибудь знает?

Спасибо

Почему вы не можете просто использовать JSON.stringify(f.toString())?

Joaquín Romero Franco 27.05.2019 22:36
Date имеет toJSON метод, который JSON.stringify вызывает сериализацию объекта в JSON. Возможно, вы могли бы заменить toJSON своим собственным методом.
user47589 27.05.2019 22:38

Возможный дубликат Как правильно указать даты с часовыми поясами в javascript?

robe007 27.05.2019 22:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете настроить 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 the toJSON() function by returning a string (the same as date.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();

Roberto Zvjerković 27.05.2019 23:12

@ritaj: Если у вас есть смешанные типы значений, вы не можете знать, была ли строка изначально датой.

Ry- 27.05.2019 23:28

Другие вопросы по теме