Как распарсить даты, представленные в нескольких форматах? (JS)

Предположим, есть строки с датами в нескольких форматах:

{
  date01: "2020-01-01T10:10:10.745Z",
  date02: "2020-01-01",
  date03: "11-05-2019 16:00 часов, www.co.uk;",
  date04: "2017-01-01 года в 18:00 (local time).",
  date05: '"02" jan. 2014'"
}

Необходимо реализовать логику модуля, который бы приводил даты к стандарту ISO 8601:

2020-01-01T10:10:10.745Z  =>  2020-01-01T10:10:10.745+06:00
2020-01-01  =>  2020-01-01T00:00:00.000Z
11-05-2019 16:00 часов, www.co.uk;  =>  2019-05-11T16:00:00.000Z
2017-01-01 года в 18:00 (local time).  =>  2017-01-01T18:00:00.000Z
"02" jan. 2014  =>  2014-01-02T00:00:00.000Z

Как можно наиболее оптимально сделать это? Я придумала только вытаскивать нужные данные (день/месяц/год/время) регулярками, а потом переводить их в ISO 8601.

  1. Есть ли способ лучше и проще регулярок?
  2. Как лучше переводить в ISO 8601? Методом toISOString()?

Ответы (2 шт):

Автор решения: Дядя Вова

Если есть возможность использовать сторонние библиотеки, то moment.js позволяет делать такой парсинг

"2017-01-01 года в 18:00 (local time)." - в данном случае без обработки строки, скорее всего, не обойтись, к сожалению

→ Ссылка
Автор решения: xxramm

Воспользуйтесь moment.js. С вашими данными у меня не заработал только 11-05-2019 16:00 часов, www.co.uk;. Т.е. есть варианты, когда вам придется писать паттерн для парсинга. Остальные, вроде, работают корректно. В формат впишите нужный вам паттерн.

    var aa = moment("2010-01-01T05:06:07").format();
    var bb = moment("2020-01-01T10:10:10.745Z").format();
    var cc = moment("2020-01-01").format();
    // Этот не работает
    var dd = moment("11-05-2019 16:00 часов, www.co.uk;").format();
    var ee = moment("2017-01-01 года в 18:00 (local time).").format();
    var ff = moment('"02" jan. 2014').format();
    
    alert(aa);
    alert(bb);
    alert(cc);
    alert(dd);
    alert(ee);
    alert(ff);
→ Ссылка