Неправильная настройка часового пояса в moment.js и пространстве-времени - PullRequest
0 голосов
/ 19 ноября 2018

Мой сервер отправляет моему клиенту 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.Сейчас я воспользуюсь хакерским обходным путем, описанным выше, но я бы предпочел использовать нативные методы, поэтому мне любопытно, почему это не работает.Есть идеи?

1 Ответ

0 голосов
/ 19 ноября 2018
  • Стандартное время в горах - UTC-7
  • Дневное время в горах - UTC-6
  • В настоящее время 19 ноября, а летнее время действует , а не Таким образом, вы в настоящее время получаете UTC-7
  • За указанную вами дату 2018-08-24T17:00:00, DST действует , поэтому вы получаете UTC-6

Все работает правильно.

Другими словами, не имеет значения, действует ли он в настоящее время или нет, только будет ли он / был / будет действовать на указанную дату.


Относительно этой части:

m.add(-(new Date()).getTimezoneOffset(), 'minutes');

Не делайте этого.Вы не настраиваете часовой пояс, вы выбираете другой момент времени.

...