Момент 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`;
Надеюсь, поможет.