Есть ли обходной путь в JSON Parse и Stringify для дат, когда пользовательский движок не принимает норму - PullRequest
0 голосов
/ 07 февраля 2019

Предыстория Я целую неделю бьюсь головой, пытаясь просто сохранить и возобновить даты планирования в JS.Чтобы сохранить даты между сессиями, мне нужно использовать Stringify, чтобы разгрузить одну строку для сохранения в качестве переменной.Я программирую JS на специальном движке (Medialon Barco), который не позволяет включать или стандартный ввод / вывод.Таким образом, все должно работать в этом одном блоке кода с небольшими вещами, не являющимися стандартными или требующими обходных путей.

Проблема Эта команда строкового преобразования JSON сохраняет объекты даты в стандартном формате "2019-03-05T09: 20: 00.000Z". Однако это конкретная команда JSON для синтаксического анализа // new Date (), не может интерпретировать этот формат строки и создает ошибку «Неверная дата».Другие форматы все же работают, т. Е. Когда я вызываю новую дату (время эпохи) или новую дату (ГГГГ, ММ, ДД, чч, мм)

Квест Я пытаюсь изменитьразделы stringify / parse, чтобы обойти эту проблему, хотя я изо всех сил.Хотя у меня есть небольшой указатель на «JSON.parse» и бит регулярных выражений, попытка манипулировать обнаружением объекта Date и изменения способа его кодирования пока что бесполезна.

Получение структуры объекта Stringified

{
  "daily": "",
  "special": [
    {
      "startDTG": "2019-03-05T09:20:00.000Z", // <- Without modifying the default stringify it gives this
      "endDTG": "2019-03-06T09:20:00.000Z",
      "mode": "0"
    }
  ],
  "current": {},
  "startup": [],
  "shutdown": []
}

Я пытался выполнить следующие операции стригирования:

        var currentEvents = JSON.stringify(this.Events, function(key,value) {
            if (value instanceof Date){             
                    return value.getTime();         
            }
            return value;
        });

Приведенное выше, однако, не обнаруживаетДата Объект.Если я использую (typeof value === 'object'), он слишком активируется.

С другой стороны, вот нерабочий для этого двигателя (но работает везде!) Код

eventLoad = JSON.parse(eventSTR, function (key, value) {
            var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
                if (typeof value === 'string' && reISO.test(value)){                
                    return new Date(value);  //value.slice(0,-5));              
            }
            return value;
        });

Цель Мне нужно найтирешение для обхода ограничений этого движка, которое позволяет мне обнаруживать и преобразовывать Date в строку во время процесса JSON.stringify в альтернативную форму, которая также позволяет функции JSON.Parse обнаруживать и импортировать ее обратно как объект Date

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

В обратном вызове JSON.parse вы можете вызвать Date.UTC с 7 аргументами и передать полученное значение эпохи в конструктор Date, например, так:

var p = value.match(/\d+/g);
return new Date(Date.UTC(p[0],p[1]-1,p[2],p[3],p[4],p[5],p[6]));

Это предполагает, что строковыйdate использует формат UTC с указанием часового пояса "Z".Это то, что JSON.stringify производит для дат.

Демо:

var event = {
    dt: new Date()
};
console.log("input:");
console.log(event);
var eventSTR = JSON.stringify(event);
console.log("stringified:");
console.log(eventSTR);
var reISO = /^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+Z$/;
var result = JSON.parse(eventSTR, function (key, value) {
    if (typeof value === 'string' && reISO.test(value)) {
        var p = value.match(/\d+/g);
        return new Date(Date.UTC(p[0],p[1]-1,p[2],p[3],p[4],p[5],p[6]));
    }
    return value;
});
console.log("parsed:");
console.log(result);

Относительно решения stringify

Если instanceof Date не работает, то вы можете проверить наличие метода-прототипа Date:

if (Object(value).getTime) {
    return value.getTime();
}

Однако на этапе синтаксического анализа вам будет трудно отличить такие числа эпох от других числовых значений;у вас не будет точного указания, следует ли преобразовать число в Date ...

0 голосов
/ 08 февраля 2019

Вы пытаетесь сделать все вручную, но уже есть методы для обработки всех этих преобразований.

Дата в ISO: https://www.w3schools.com/jsref/jsref_toisostring.asp

ISO в дату: Конвертировать формат даты в дату в формате гггг-мм-дд в формате javascript

И, в частности, для формата :00.000Z см. Этот ответ: Что означает этот формат T00: 00: 00.000Z?

Moment.js также отлично экономит время для такого рода вещей: http://momentjs.com/

...