Javascript - отображать дату и время и игнорировать языковой стандарт / часовой пояс
Мне немного снится работа с CMS, которая сохраняет время без часовых поясов. По целому ряду причин, связанных с инфраструктурой, я не могу настроить файлы ядра, я могу настроить только некоторые из javascript самого поля CMS и не включать внешние библиотеки (или плагин dayjs UTC).
Как это сейчас работает:
- CMS сохраняет строку даты и времени следующим образом:
2020-10-29 05:00
в котором отсутствует часовой пояс - При перезагрузке dayjs разбирает строку
2020-10-29 05:00
в качествеUTC
и изменяет время в зависимости от языкового стандарта браузера. - Если вы используете браузер, отличный от UTC, отображаемое время не будет соответствовать сохраненной строке.
Моя хакерская идея:
- При загрузке строки получить часовой пояс браузера
- Измените строку
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));