Проблемы с Date() при использовании JSON.stringify() и JSON.parse()

Я пытаюсь вычислить разницу между двумя разами, используя JavaScript. Это просто базовая математика, но у меня, кажется, есть некоторые проблемы с этим при использовании JSON.stringify() а также JSON.parse(),

Если вам интересно, почему я применяю JSON.stringify() до сегодняшнего дня, потому что я использую локальное хранилище для хранения некоторых данных на стороне клиента и использую их всякий раз, когда клиент снова заходит на мой сайт (это быстрее, чем больше запросов к серверу). Эти данные обычно обновляются время от времени (я собираю данные через API с другого сайта), поэтому я настроил data_update переменная, и я храню его вместе с другими данными.

Таким образом я беру хранимые данные из локального хранилища и проверяю разницу между data_update (это дата / время) и время / дата, когда была произведена проверка, и посмотрите, больше ли это неделя / день / и т. д.

Вот почему я использую функции JSON. Моя проблема в том, что когда я анализирую данные из локального хранилища, дата, кажется, отличается от Date() объект.

Я пытаюсь сделать следующую операцию, скажем:

var x = JSON.parse(JSON.stringify(new Date()));

var y = JSON.parse(this.get_local_storage_data(this.data_cache_key)); // the data object stored on local storage

var q = y.data_update; // this is the variable where the Date() was stored

console.log(Math.floor((x-q)/1000));

Выше вернется null, Также, когда я хочу увидеть Math.floor(x) результат, он возвращает null снова.

Так что я могу сделать в этой ситуации? Можно ли это исправить?

3 ответа

Решение

Если вы посмотрите на вывод JSON.stringify для Date, вы увидите, что:

JSON.stringify(new Date())

Результаты в строке. JSON не имеет примитивного представления объектов Date, которое JSON.parse автоматически превратит в объект Date.

Конструктор объекта Date может принимать строку даты, поэтому вы можете превратить эти строковые значения обратно в даты, выполнив:

var x = new Date(JSON.parse(JSON.stringify(new Date())));

Тогда арифметика будет работать.

x = new Date(JSON.parse(JSON.stringify(new Date())))
y = new Date(JSON.parse(JSON.stringify(new Date())))
y - x
=> 982
JSON.stringify(new Date())

возвращается

"2013-10-06T15:32:18.605Z"

Слава Богу это: Date.prototype.toISOString()

Как следует из рекомендуемого ответа, дата просто преобразуется в строку при использовании JSON.stringify.

Другой подход, который, возможно, подходит для этого варианта использования, состоит в том, чтобы хранить время в миллисекундах, используя Date.now():

ПРИМЕЧАНИЕ. Использование миллисекунд в качестве представления даты обычно не рекомендуется, по крайней мере, не в вашей базе данных: /questions/13878288/kak-sohranit-datu-v-millisekundah-unix-v-mysql/13878294#13878294.

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