Мой сервер отправляет моему клиенту Javascript метку времени в формате UTC.В настоящее время я нахожусь в Маунтин-времени, которое в настоящее время в летнее время (GMT-7), но любая корректировка часового пояса, которую я делаю, только применяет смещение -6.
Чтобы подтвердить, что javascript даже знает о моем часовом поясе, ясделал следующее:
console.log(Date().toString());
, что выдает следующее: Mon Nov 19 2018 12:13:28 GMT-0700 (Mountain Standard Time)
.Ясно, что JS знает, что я сейчас в GMT-7.
Теперь мой сервер отправляет 2018-08-24T17:00:00
.Поэтому я анализирую его с помощью moment.js, преобразую в местный часовой пояс, а затем форматирую результат.
moment.utc(this.props.value).local().format('h:mm A')
Полученное значение равно 11:00 AM
.17:00:00 - 7 смещение - 10:00, то есть 10:00.Почему JavaScript конвертируется в 11:00?Я получу тот же результат, если попробую библиотеку spacetime :
const s = spacetime(this.props.value,'UTC')
s.goto(spacetime().timezone().name);
console.log(s.format('h:mm a')); // Also spits out 11:00 AM
Если я вручную отрегулирую объект момента со смещением, он будет работать правильно:
var m = moment.utc(this.props.value);
m.add(-(new Date()).getTimezoneOffset(), 'minutes');
console.log(m.format('h:mm A')) // Outputs the correct time: 10:00 AM
Почему moment
и spacetime
не корректно корректируют мой часовой пояс, когда Javascript четко знает, в каком часовом поясе я нахожусь?Та же проблема возникает как в Chrome, так и в Microsoft Edge.Сейчас я воспользуюсь хакерским обходным путем, описанным выше, но я бы предпочел использовать нативные методы, поэтому мне любопытно, почему это не работает.Есть идеи?