Сохранить и загрузить дату localalstorage
Я должен сохранить дату в localStorage, и когда страница обновляется, я хочу подсчитать, сколько времени прошло с тех пор.
Теперь вот проблема: localStorage сохраняет дату в виде строки, поэтому после ее сохранения в localStorage при попытке вычислить разницу между этими двумя датами возвращается NaN.
Попробуйте это в вашей консоли JavaScript:
var a = new Date();
var b = new Date();
console.log(b - a); //this works
localStorage.a = a;
localStorage.b = b;
console.log(localStorage.b - localStorage.a); //this doesn't work
Я тоже пробовал JSON.stringify
а также JSON.parse
пытаясь сохранить объект даты в целости, но это тоже не работает.
Я предполагаю, что я должен разобрать дату в localStorage. Если нет лучшего способа, как я могу это сделать?
9 ответов
Демо: http://jsfiddle.net/AuhtS/
Код:
var a = new Date();
var b = new Date();
console.log(b - a); //this works
localStorage.a = a;
localStorage.b = b;
a = Date.parse(localStorage.a); // parse to date object
b = Date.parse(localStorage.b);
console.log(b - a); // now, this will work
причина
Все хранится в виде строки в localStorage
,
Итак, когда вы делаете localStorage.b - localStorage.a
То, что вы пытаетесь вычесть одну строку из другой. Вот почему это не работает.
Чтобы сохранить дату в localStorage, просто сделайте
localStorage['key'] = ''+myDate.getTime();
И восстановить это:
var myDate = new Date(parseInt(localStorage['key'], 10));
(вы также можете проверить это определено ранее)
Он также работает с длительностью (дата минус другая): просто используйте значение как long (миллисекунды) и конвертируйте в и из строки.
Обратите внимание, что JSON не включает стандартизированный формат даты. Не используйте JSON для дат.
http://rhaboo.org/ - это слой сахара над localStorage, который (среди прочего) исправляет подобные вещи. Вы бы просто написать:
var store = Rhaboo.persistent("My Store Name");
console.log ( "Your last visit was " + store.datestamp || "never.");
store.write('datestamp', new Date());
Кстати, я написал Rhaboo.
Я бы использовал это:
var d1 = new Date();
localStorage.setItem("key", d1.getTime());
var d2 = new Date(parseInt(localStorage.getItem[key]));
все, чего не хватает, так это правильной нулевой проверки.
Вы можете просто пойти на:
var date1 = <date1>
var date2 = <date2>
localStorage.setItem('date1', date1.toString())
localStorage.setItem('date2', date2.toString())
var date1 = new Date(localStorage.getItem('date1'))
var date2 = new Date(localStorage.getItem('date2'))
var diff = date1 - date2
В моем случае мне это нужно в Date
тип. Поэтому вот оно:
var a = new Date();
localStorage.a = a;
var c = new Date(localStorage.a);
Date Comparison from Local Storage :
var date1 = <date1>
var date2 = <date2>
localStorage.setItem('date1', date1.toString())
localStorage.setItem('date2', date2.toString())
var date1 = Date.parse(localStorage.getItem('date1'))
var date2 = Date.parse(localStorage.getItem('date2'))
var diff = date1 - date2
localStorage.setItem("date", new Date().toString());
вы можете напрямую добавить вот так
Я считаю, что localStorage принимает только временные метки. Поправьте меня, если я ошибаюсь. Я предлагаю вам использовать библиотеку моментов вместо встроенной библиотеки Date JS. moment намного проще в использовании и имеет несколько удобных встроенных функций. Один из них - toString(), который позволяет анализировать данные как строку. пример:
// create a moment (the current time)
const now = moment()
// convert it to a timestamp to store it in localStorage
now.valueOf()
// get the data back in string format
now.toString()
Moment также имеет полезный метод .fromNow(), который позволяет получить разницу во времени от даты создания до момента ее редактирования. Надеюсь, это поможет. прочтите документы на данный момент для получения дополнительной информации здесь: https://momentjs.com/docs/