Момент js выбирает неправильный часовой пояс / смещение, поэтому преобразование из UTC в местное время является неправильным

Я прочитал несколько статей, документы по моментам и несколько вопросов (здесь о стекаповороте), касающихся обработки моментов и часовых поясов, но я не нашел ответа на вопрос, как момент решает, каково локальное смещение UTC. Я нахожусь в часовом поясе Америки / Денвера, и на момент написания этой статьи смещение составляет UTC-07:00. Часы Windows установлены правильно и правильно отображают местное время. Для метки времени UTC "2017-04-24 17:33:55" я ожидаю, что следующий код будет регистрировать displayDate как "04/24 10:12:34"

dateString = "2017-04-24 17:12:34"
console.log("dateString: " + dateString)
utc = moment.utc(dateString)
console.log("utc: " + utc.format())
now = moment(utc.format())
console.log("now: " + now.format())
displayDate = now.format("MM/DD HH:mm:ss")
console.log("displayDate: " + displayDate)

Но вот что показывает консоль:

dateString: 2017-04-24 17:12:34
utc: 2017-04-24T17:12:34Z
now: 2017-04-24T18:12:34+01:00
displayDate: 04/24 18:12:34

Я понятия не имею, как он думает, что я нахожусь в часовом поясе со смещением UTC+01:00. Я не использую момент-часовой пояс и не смог понять, почему момент подбирает неправильное смещение. Я заметил, что есть переменная окружения TZ, установленная в Америку / Денвер, так что это явно не имеет никакого эффекта. Как момент определяет локальное смещение? Есть ли какая-то настройка по умолчанию, которая где-то испортилась? Это должно быть что-то на моей машине, потому что тот же код работает правильно на другой машине.

Если это помогает, этот код живет в приложении AngularJS (версия 1.5.8).

Ура, Рич

3 ответа

Из нормального вывода JavaScript Date(). ToString() он дал мне подсказку о переменной окружения TZ, так как она была установлена ​​в "America/Denver". Я сбросил переменную среды TZ, затем перезапустил веб-сервер (служба Tomcat) и попытался снова. У меня возникла та же проблема, но я все равно решил перезагрузить всю машину. В конце концов, это решение многих проблем на компьютерах с Windows... Конечно, это сработало!

Суть в том, что JavaScript должен использовать переменную окружения TZ (переопределяя системные настройки даты и времени), и кажется, что он смотрит только на первые три символа.

Надеюсь, это поможет кому-то еще.

Если вы используете moment.js, вы можете конвертировать UTC в местный часовой пояс.

Сначала вы добавите библиотеку moment.js

Затем после этого определите переменную дату и присвойте дату и время в часовом поясе UTC, например

var date = '2017-12-25 10:50:18';

// (дата и время UTC)

var stillUtc = moment.utc (date).toDate ();

// Преобразование в местный часовой пояс

var local = момент (stillUtc).local(). формат ('ГГГГ-ММ-ДД ЧЧ: мм: сс');

Получить местное время в локальной переменной. Вы можете распечатать локальную переменную и проверить свой ответ

console.log(местное);

Ваш консольный результат "2017-12-25 16:20:18"

Я обнаружил, что это работает для получения аналогичной строки в ISO

 const isoDate = `${moment(item.startDate).format()}Z`;

Надеюсь, поможет.

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