Moment.js предоставляет мощные инструменты для работы с датами и временем, включая поддержку временных зон через библиотеку moment-timezone. Управление временными зонами критично для приложений, которые работают с пользователями из разных регионов, автоматизируют расписания или обрабатывают события по мировому времени.
Для работы с временными зонами необходимо подключить расширение
moment-timezone. В Node.js это делается так:
const moment = require('moment-timezone');
В браузере можно подключить библиотеку через
<script> или использовать сборщики модулей. После
подключения доступны методы для преобразования даты в любую временную
зону.
В Moment.js каждая дата хранит своё локальное время, но может быть
преобразована к определённой временной зоне. Присвоение временной зоны
осуществляется с помощью метода .tz():
const m = moment.tz("2026-05-22 12:00", "Europe/Moscow");
console.log(m.format()); // 2026-05-22T12:00:00+03:00
Здесь "Europe/Moscow" — идентификатор временной зоны по
стандарту IANA. Важный момент: все преобразования происходят без
изменения фактического момента времени, меняется только
локальное представление.
Moment.js позволяет конвертировать дату в любую временную зону:
const moscowTime = moment.tz("2026-05-22 12:00", "Europe/Moscow");
const newYorkTime = moscowTime.clone().tz("America/New_York");
console.log(newYorkTime.format()); // 2026-05-22T05:00:00-04:00
.clone() создаёт копию даты, чтобы исходный объект не
изменялся..format() используется для вывода в читаемом формате
или с определённым шаблоном, например
"YYYY-MM-DD HH:mm:ss Z".Для создания даты с текущим моментом времени в конкретной зоне:
const nowInTokyo = moment.tz("Asia/Tokyo");
console.log(nowInTokyo.format("YYYY-MM-DD HH:mm:ss Z"));
Метод .tz() автоматически определяет смещение и летнее
время для выбранной зоны.
Moment.js позволяет легко переводить дату в UTC и обратно:
const local = moment.tz("2026-05-22 12:00", "Europe/Moscow");
const utc = local.clone().utc();
console.log(utc.format()); // 2026-05-22T09:00:00Z
.utc() переводит дату в координированное время.Сравнение дат напрямую через .isBefore() или
.isAfter() корректно работает, если даты находятся в одной
временной зоне или преобразованы в UTC:
const paris = moment.tz("2026-05-22 15:00", "Europe/Paris");
const moscow = moment.tz("2026-05-22 16:00", "Europe/Moscow");
console.log(paris.isBefore(moscow)); // true
Важно помнить: внутренне Moment.js хранит время как миллисекунды с начала эпохи, поэтому сравнение учитывает реальные значения, а не только локальные часы.
Moment.js позволяет вычислять разницу между двумя временными зонами:
const london = moment.tz("2026-05-22 12:00", "Europe/London");
const sydney = moment.tz("2026-05-22 12:00", "Australia/Sydney");
const diffHours = sydney.diff(london, 'hours');
console.log(diffHours); // 9
.diff() возвращает разницу в указанных единицах
('milliseconds', 'seconds',
'minutes', 'hours', 'days').Moment-timezone предоставляет полную базу IANA временных зон. Для получения списка всех доступных зон используется метод:
console.log(moment.tz.names());
Этот список позволяет динамически назначать зоны пользователям и корректно обрабатывать время независимо от местоположения.
Переход на летнее время Необходимо учитывать,
что при переходе часы могут сдвигаться, и некоторые локальные часы могут
быть «невалидными» или повторяться. Moment.js корректно обрабатывает
такие случаи при создании даты через .tz().
Хранение в базе Рекомендуется хранить даты в UTC и конвертировать в локальные зоны при выводе. Это предотвращает ошибки при смене часового пояса или летнего времени.
Обновление базы зон Moment-timezone регулярно обновляется с актуальной информацией о временных зонах. Для приложений с критически важной точностью необходимо следить за версиями базы.
Для отображения временной зоны в формате строки:
const tokyo = moment.tz("2026-05-22 12:00", "Asia/Tokyo");
console.log(tokyo.format("YYYY-MM-DD HH:mm:ss z")); // 2026-05-22 12:00: JST
z выводит короткое обозначение зоны (например, JST,
EST).Z выводит смещение от UTC (+09:00).Moment.js и moment-timezone могут работать с объектами
Date:
const date = new Date();
const m = moment.tz(date, "Europe/Moscow");
console.log(m.format());
Это удобно при интеграции с API или базами данных, где используется
стандартный объект Date.
Работа с временными зонами в Moment.js требует внимательности к переходам на летнее время, корректного хранения и преобразования дат. Использование moment-timezone упрощает эти задачи и обеспечивает точность при глобальных приложениях.