Javascript - отображение даты и времени и игнорирование локали / часового пояса - PullRequest
0 голосов
/ 06 марта 2020

У меня небольшой кошмар при работе с CMS, которая сохраняет время без часовых поясов. По разным причинам инфраструктуры Я не могу настроить основные файлы , я могу настроить только некоторые из javascript самого поля CMS и не включать внешние библиотеки (или день js UT C плагин).

Как это работает в настоящее время:

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

Моя идея:

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

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

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

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

1 Ответ

0 голосов
/ 07 марта 2020

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

Кроме того, с учетом:

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

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

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

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

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));
...