Moment.js предоставляет гибкие возможности для работы с датами и временем, включая создание объектов с учётом временных зон. Для этого используется расширение Moment Timezone, которое позволяет корректно обрабатывать локальное и глобальное время, а также выполнять конвертацию между часовыми поясами.
Для работы с временными зонами необходимо подключить дополнительный
модуль moment-timezone:
const moment = require('moment-timezone');
После подключения доступны методы для создания и манипуляции датами с учётом временных зон.
Базовый способ — использование функции tz из Moment
Timezone. Она принимает строку даты и идентификатор временной зоны:
const dateInNY = moment.tz("2026-05-21 12:00", "America/New_York");
console.log(dateInNY.format()); // 2026-05-21T12:00:00-04:00
Ключевые моменты:
Date.America/New_York, Europe/Moscow и т.д.).Moment теперь хранит дату с учётом указанной
зоны, включая смещение от UTC.Для создания объекта с текущим моментом времени в определённой зоне используется:
const nowInTokyo = moment.tz("Asia/Tokyo");
console.log(nowInTokyo.format()); // например, 2026-05-22T01:00:00+09:00
Если не указывать дату, Moment автоматически берёт текущее локальное время и преобразует его в указанную зону.
С помощью метода tz можно конвертировать существующий
объект Moment в другую временную зону:
const dateInLondon = dateInNY.clone().tz("Europe/London");
console.log(dateInLondon.format()); // 2026-05-21T17:00:00+01:00
Особенности:
clone(), чтобы исходный объект оставался
неизменным.Moment.js различает локальное и UTC время. Для создания объекта в UTC
используется метод utc:
const utcDate = moment.utc("2026-05-21 12:00");
console.log(utcDate.format()); // 2026-05-21T12:00:00Z
Для перехода к конкретной зоне:
const dateInMoscow = utcDate.clone().tz("Europe/Moscow");
console.log(dateInMoscow.format()); // 2026-05-21T15:00:00+03:00
Таким образом, UTC используется как базовое время, от которого можно строить любые временные зоны.
Кроме идентификаторов временных зон можно использовать числовые смещения от UTC:
const dateWithOffset = moment.parseZone("2026-05-21T12:00-07:00");
console.log(dateWithOffset.format()); // 2026-05-21T12:00:00-07:00
parseZone создаёт объект с фиксированным
смещением.tz, смещение не изменяется автоматически
при конвертации.Moment Timezone содержит полный список IANA временных зон. Для получения всех доступных можно использовать:
console.log(moment.tz.names());
Это важно при динамическом выборе временной зоны, например, в веб-приложениях с пользовательскими настройками.
Europe/Moscow,
America/Los_Angeles) вместо аббревиатур (MSK,
PST), так как аббревиатуры могут быть неоднозначны.format() учитывает смещение и корректно выводит
дату вместе с часовой зоной.Создание нескольких объектов в разных временных зонах и их синхронизация:
const meetingNY = moment.tz("2026-05-21 09:00", "America/New_York");
const meetingLondon = meetingNY.clone().tz("Europe/London");
const meetingTokyo = meetingNY.clone().tz("Asia/Tokyo");
console.log(meetingNY.format()); // 2026-05-21T09:00:00-04:00
console.log(meetingLondon.format()); // 2026-05-21T14:00:00+01:00
console.log(meetingTokyo.format()); // 2026-05-22T22:00:00+09:00
Это позволяет планировать события с учётом глобального времени и корректно отображать их в локальных зонах.
Создание объектов Moment.js с временной зоной обеспечивает гибкость при работе с международными приложениями, календарями и расписаниями, гарантируя точность и корректное учёт смещений и переходов на летнее/зимнее время.