Получение объекта Date из хранилища Chrome не работает

В расширении Chrome я пытаюсь сохранить объект Date в хранилище, а затем прочитать его обратно. Согласно официальной документации,

Значения с типом "object" и "function" обычно сериализуются в {}, за исключением Array (сериализуется, как ожидается), Date и Regex (сериализуются с использованием их представления String).

Я сохраняю в хранилище как:

 var value= new Date(Date.now());
 chrome.storage.sync.set({"testdate":value}, function(){
     console.log("saved testdate to storage:");
     console.log(value);

 });

Выходные данные регистрации значения

Вт 16 октября 2018 08:22:11 GMT-0700 (тихоокеанское летнее время)

Я позже извлекаю из хранилища как:

chrome.storage.sync.get("testdate", function(items){

        console.log("test date from storage:");
        console.log(items.testdate);
});

В этом случае значение logging items.testdate равно:

Прото объекта: конструктор: ƒ Object() hasOwnProperty: ƒ hasOwnProperty() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toLocaleString: ƒ toLocaleString() toString: et toString () valueG) defineSetter: ƒ defineSetter () lookupGetter: ƒ lookupGetter () lookupSetter: ƒ lookupSetter () получить прото: ƒ proto () установить прото: (proto ()

Не могу понять, как вернуть мой объект Date (или строковое представление для преобразования обратно в Date)

2 ответа

Сторона установки

const currentTime = (new Date()).toJSON();
const items = { 'testdate': currentTime }; 
chrome.storage.local.set(items, () => {
    if (chrome.runtime.lastError) {
        console.error(chrome.runtime.lastError.message);
    }
});

Получение стороны

chrome.storage.local.get(['testdate'], (result) => {
    if (chrome.runtime.lastError) {
        console.error(chrome.runtime.lastError.message);
    } else {
        const storedJSONDate = result['testdate'];
        const testdate = new Date(storedJSONDate);
        console.log(testdate);
    }
});

Источники

Я основал свой код на Date.prototype.toJSON, в котором говорится

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);

console.log(jsonDate); //2015-10-26T07:46:36.611Z

Из официальной документации по хранилищу Chrome, я думаю, говорится, что Date не будет сериализоваться должным образом. Поскольку он указывает, как сериализуется массив и регулярное выражение, но не как сериализуется Date, я думаю, что он сериализуется в{}, что я получил, когда не включил toJSON() части.

Объект, который предоставляет каждую пару ключ / значение для обновления хранилища. Никакие другие пары ключ / значение в хранилище не будут затронуты. Примитивные значения, такие как числа, будут сериализованы должным образом. Значения с типом "объект" и "функция" обычно сериализуются в {}, за исключением Array (сериализуется, как ожидалось), Date и Regex (сериализуются с использованием их строкового представления).

Также можно использовать getTime():

      //set
const currentTime = (new Date()).getTime();  //equals (new Date()).valueOf()
const items = {'testdate': currentTime};
chrome.storage.local.set(items);

//get
chrome.storage.local.get('testdate', (items) => {
    const time = items['testdate'];
    const testdate = new Date(time);
    console.log(testdate);
});
Другие вопросы по тегам