Как преобразовать дату Moment.js в местный часовой пояс пользователя?

84

Я использую фреймворки Moment.js и Moment-Timezone, и у меня есть объект даты Moment.js, который явно находится в часовом поясе UTC. Как я могу преобразовать это в текущий часовой пояс браузера?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

Так что было бы хорошо, если бы я мог узнать местный часовой пояс пользователя; или, в качестве альтернативы, я хотел бы преобразовать объект даты в другой объект данных, который просто использует «местный часовой пояс», независимо от того, что это на самом деле.

Оливер
источник

Ответы:

140

Для этого не нужно использовать момент-часовой пояс. Основная библиотека moment.js имеет полный функционал для работы с UTC и местным часовым поясом.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Оттуда вы можете использовать любые ожидаемые функции:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Обратите внимание , что при пропускании testDateUtc, который является momentобъектом, обратно в moment()конструктор, он создает клон . В противном случае, когда вы вызываете .local(), он также изменит testDateUtcзначение, а не только localDateзначение. Моменты изменчивы .

Также обратите внимание, что если ваш исходный ввод содержит смещение часового пояса, например +00:00или Z, вы можете просто проанализировать его напрямую с помощью moment. Вам не нужно использовать .utcили .local. Например:

var localDate = moment("2015-01-30T10:00:00Z");
Мэтт Джонсон-Пинт
источник
4
Вы должны знать, что этот метод не учитывает смещения летнего времени, безопаснее использовать moment-timezoneбиблиотеку
Хайме Агудо,
2
@ Хайме неправда. localдействительно учитывает летнее время.
Мэтт Джонсон-Пинт,
Вы можете проверить самостоятельно, например, перевод с ESTна CET, я поставлю пример завтра, если хотите NY-> Madrid. Я приму контрпример :)
Хайме Агудо
1
вы правы, этот момент не может осуществить такое преобразование без временного часового пояса. Однако он может правильно конвертировать между UTC и локальным, что и просил OP.
Мэтт Джонсон-Пинт,
2
Локальные правила исходят из браузера. Итак, пока местный часовой пояс включает летнее время, момент будет использовать его.
Мэтт Джонсон-Пинт,
23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Определите свой формат даты.
  2. Создайте объект момента и установите для флага UTC значение true.
  3. Создайте локализованный объект момента, преобразованный из исходного объекта момента.
  4. Вернуть отформатированную строку из локализованного объекта момента.

См .: http://momentjs.com/docs/#/manipulating/local/

Эндрю Хендерсон
источник
Этот ответ был бы даже лучше, если бы он объяснил, почему это работает, возможно, со ссылками на документацию. Кроме того, вы можете объяснить, чем этот ответ отличается от того, что был опубликован в марте ...
Обезьяна-еретик
@AndrewHenderson, время на час опережает локальное машинное время. Почему это происходит?
Рамеш Папаганти
@RameshPapaganti Может быть, летнее время? Например, PDT против PST. Известно, что момент меняет API между версиями, особенно когда дело касается локализации. Дайте мне знать, если вы нашли причину.
AndrewHenderson
6

Вот что я сделал:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

Где {{ time }}метка времени utc.

Саян
источник
3

Используйте функцию utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
Алексей Ряжских
источник