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

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

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

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

Структура объекта становится строковой

{
  "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;
        });

Однако вышеприведенное не обнаруживает объект Date. Если я использую (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;
        });

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

TLDR В чем именно заключается вопрос? См. Как спросить

geoidesic 07.02.2019 21:58
"вот нерабочий для этого двигателя...": что именно происходит? Это регулярное выражение, которое не работает? Это метод test не работает? Это new Date неправильно интерпретирует аргумент? Если да, то как? Есть ли исключение?
trincot 07.02.2019 21:59

@trincot Сам сбой возникает, когда ``` new Date("2019-03-06T09:20:00.000Z"); ``` вызывается. Результатом является искаженный объект Date, в котором не работают функции получения. Отладчик, предоставляемый этим движком, не жалуется, кроме сообщения «Неверная дата». и когда я привожу объект Date к строке, я получаю только ту же «Неверную дату» @geoidesic. Я переписал часть цели с более четким вопросом.

Antony T. 07.02.2019 22:12
«Это, однако, не обнаруживает строку».: Я не понимаю эту часть. Ваш исходный объект не содержит объекты Date? Почему он должен обнаруживать (другие) строки?
trincot 07.02.2019 22:29

@trincot Я исправил словосочетание, которое от моего имени было мозговым пердежом, оно не обнаруживало объекты даты.

Antony T. 07.02.2019 22:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
982
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

ISO на сегодняшний день: Преобразование даты ISO в формат даты yyyy-mm-dd в javascript

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

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

Ответ принят как подходящий

В обратном вызове 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]));

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

Демо:

var event = {
    dt: new Date()
};
console.info("input:");
console.info(event);
var eventSTR = JSON.stringify(event);
console.info("stringified:");
console.info(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.info("parsed:");
console.info(result);

По поводу решения stringify

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

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

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

Этот ответ работает! Мне пришлось компенсировать разные форматы IE 0-11 за месяц против 1-12 за месяц. Десятикратное спасибо!

Antony T. 08.02.2019 01:11

@ Энтони — p[1] должен быть p[1] - 1 для всех. Это вещь ECMAScript, а не специфичная для IE.

RobG 08.02.2019 02:27

Можете ли вы обновить ответ, чтобы исправить индекс месяца? Вы не можете использовать спред таким образом, так как месяц все еще нужно уменьшить. :-)

RobG 08.02.2019 02:32

Спасибо за отзыв о месяце. Исправлено.

trincot 08.02.2019 09:21

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