Проблемы с 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.