Javascript - отображать дату и время и игнорировать языковой стандарт / часовой пояс

Мне немного снится работа с CMS, которая сохраняет время без часовых поясов. По целому ряду причин, связанных с инфраструктурой, я не могу настроить файлы ядра, я могу настроить только некоторые из javascript самого поля CMS и не включать внешние библиотеки (или плагин dayjs UTC).

Как это сейчас работает:

  1. CMS сохраняет строку даты и времени следующим образом: 2020-10-29 05:00 в котором отсутствует часовой пояс
  2. При перезагрузке dayjs разбирает строку 2020-10-29 05:00 в качестве UTC и изменяет время в зависимости от языкового стандарта браузера.
  3. Если вы используете браузер, отличный от UTC, отображаемое время не будет соответствовать сохраненной строке.

Моя хакерская идея:

  1. При загрузке строки получить часовой пояс браузера
  2. Измените строку 2020-10-29 05:00 для включения часового пояса браузера или смещения объекта даты, чтобы при его анализе как "локальном" он отображался правильно

Моя первоначальная мысль заключалась в том, чтобы просто добавить / вычесть смещение перед отображением, но это все еще не работало (я думаю, из-за того, что getTimezoneOffset не настраивается на летнее время?):

let date = new Date('2020-10-29 05:00')
console.log(new Date(date.setMinutes(date.getMinutes() + new Date().getTimezoneOffset())))

Я полагаю, что альтернативная форма этого вопроса: есть ли способ проанализировать строку даты и времени UTC, как если бы она была локальной?

1 ответ

Если строка - это UTC, вы должны проанализировать ее как UTC, а затем сделать все в UTC. Я думаю, что самый простой способ - проанализировать строку как UTC с помощью вашей собственной функции или библиотеки.

Также, учитывая:

new Date('2020-10-29 05:00')

некоторые браузеры возвращают недопустимую дату (они рассматривают ее как искаженную версию поддерживаемого формата ГГГГ-ММ-ДДТЧЧ: мм: сс).

Как правило, использование встроенного анализатора настоятельно не рекомендуется из-за несогласованности браузера. Кроме того, возня со смещениями часовых поясов также может привести к трудностям при поиске проблем (например, когда применение смещения заставляет дату пересекать границу летнего времени).

Простая функция для выполнения работы:

function parseAsUTC(s) {
  let [y, m, d, H, M] = s.split(/\D/);
  return new Date(Date.UTC(y, m-1, d, H, M));
}

let s = '2020-10-29 05:00';
console.log(parseAsUTC(s));

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