При работе с датой и временем недостаточно хранить только календарную
дату и часы. Одно и то же значение времени может означать разные моменты
в зависимости от часового пояса. Для решения этой задачи в экосистеме
Moment.js используется дополнение moment-timezone.
Подключение библиотеки:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
Для Node.js:
const moment = require('moment-timezone');
После подключения становятся доступны методы получения информации о временной зоне, смещении UTC и названии часового пояса.
Метод moment.tz.guess() определяет временную зону
пользователя на основе настроек окружения.
const zone = moment.tz.guess();
console.log(zone);
Пример результата:
Asia/Almaty
Метод особенно полезен:
Для корректной работы с часовыми поясами используется метод
moment.tz().
const date = moment.tz("2026-05-21 18:30", "Europe/Moscow");
console.log(date.format());
Результат:
2026-05-21T18:30:00+03:00
В объекте сохраняется:
Метод tz() без аргументов возвращает идентификатор
текущей зоны.
const date = moment.tz("Asia/Tokyo");
console.log(date.tz());
Результат:
Asia/Tokyo
Пример с конкретной датой:
const meeting = moment.tz(
"2026-10-01 12:00",
"Europe/Berlin"
);
console.log(meeting.tz());
utcOffset()Метод возвращает смещение в минутах.
const date = moment.tz("Europe/London");
console.log(date.utcOffset());
Результат летом:
60
Результат зимой:
0
Положительные значения означают смещение вперёд относительно UTC, отрицательные — назад.
Для удобства смещение часто переводят в часы.
const offset = moment.tz("Asia/Almaty").utcOffset();
console.log(offset / 60);
Результат:
5
isDST()Позволяет определить, действует ли летнее время.
const summer = moment.tz(
"2026-07-01",
"Europe/Berlin"
);
console.log(summer.isDST());
Результат:
true
Для зимней даты:
const winter = moment.tz(
"2026-01-01",
"Europe/Berlin"
);
console.log(winter.isDST());
Результат:
false
Часовые пояса могут изменять смещение из-за перехода на летнее время.
const january = moment.tz(
"2026-01-15",
"America/New_York"
);
const july = moment.tz(
"2026-07-15",
"America/New_York"
);
console.log(january.utcOffset());
console.log(july.utcOffset());
Результат:
-300
-240
zoneAbbr()Возвращает сокращённое название зоны.
const date = moment.tz(
"2026-05-21",
"America/New_York"
);
console.log(date.zoneAbbr());
Результат:
EDT
Зимой:
EST
zoneName()const date = moment.tz(
"2026-05-21",
"America/New_York"
);
console.log(date.zoneName());
Возможный результат:
Eastern Daylight Time
moment.tz.names()const zones = moment.tz.names();
console.log(zones.length);
Результат:
597
Вывод части списка:
console.log(zones.slice(0, 10));
Результат:
[
'Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
...
]
Перед использованием зоны полезно убедиться, что она существует.
const zone = moment.tz.zone("Europe/Paris");
console.log(zone !== null);
Результат:
true
Несуществующая зона:
const zone = moment.tz.zone("Mars/Colony");
console.log(zone);
Результат:
null
Метод moment.tz.zone() возвращает объект с подробной
информацией.
const zone = moment.tz.zone("Europe/Moscow");
console.log(zone);
Объект содержит:
console.log(zone.name);
Результат:
Europe/Moscow
console.log(zone.offsets);
Пример результата:
[180, 240, 180]
Смещения указываются в минутах.
console.log(zone.untils);
Массив содержит временные границы изменения смещения.
const zone = moment.tz.zone("Asia/Tokyo");
const timestamp = Date.now();
console.log(zone.utcOffset(timestamp));
Результат:
-540
Важно учитывать, что zone.utcOffset() использует
обратный знак по сравнению с moment().utcOffset().
utcOffset() и zone.utcOffset()moment().utcOffset()
Результат:
180
zone.utcOffset(Date.now())
Результат:
-180
Это историческая особенность библиотеки Moment Timezone.
const local = moment();
console.log(local.format());
Moment автоматически использует системную временную зону.
console.log(
Intl.DateTimeFormat().resolvedOptions().timeZone
);
Результат:
Asia/Almaty
Хотя это уже API браузера, оно часто используется совместно с Moment.js.
const moscow = moment.tz(
"2026-05-21 15:00",
"Europe/Moscow"
);
const tokyo = moscow.clone().tz("Asia/Tokyo");
console.log(tokyo.format());
Результат:
2026-05-21T21:00:00+09:00
const london = moment.tz("Europe/London");
const dubai = moment.tz("Asia/Dubai");
console.log(london.utcOffset());
console.log(dubai.utcOffset());
Результат:
60
240
Zconst date = moment.tz(
"Asia/Tokyo"
);
console.log(date.format("Z"));
Результат:
+09:00
ZZconsole.log(date.format("ZZ"));
Результат:
+0900
isUTC()const utcDate = moment.utc();
console.log(utcDate.isUTC());
Результат:
true
const utc = moment.utc();
console.log(utc.format());
Результат:
2026-05-21T10:00:00Z
Преобразование в локальную зону:
console.log(
utc.local().format()
);
const offset = moment().utcOffset();
console.log(offset);
Пример результата:
300
parseZone()Метод сохраняет исходное смещение строки.
const date = moment.parseZone(
"2026-05-21T12:00:00+05:00"
);
console.log(date.utcOffset());
Результат:
300
Без parseZone() смещение может быть преобразовано в
локальную зону.
const date = moment.parseZone(
"2026-05-21T10:00:00-04:00"
);
console.log(date.format("Z"));
Результат:
-04:00
function isValidTimezone(name) {
return moment.tz.zone(name) !== null;
}
console.log(
isValidTimezone("Asia/Almaty")
);
console.log(
isValidTimezone("Moon/Base")
);
Результат:
true
false
const zones = [
"Europe/London",
"Asia/Tokyo",
"America/New_York"
];
zones.forEach(zone => {
const time = moment().tz(zone);
console.log(
zone,
time.format("HH:mm")
);
});
function worldClock(zone) {
return moment()
.tz(zone)
.format("YYYY-MM-DD HH:mm:ss");
}
console.log(
worldClock("Asia/Almaty")
);
console.log(
worldClock("Europe/Berlin")
);
Moment Timezone использует базу данных IANA Time Zone Database.
Примеры идентификаторов:
Europe/MoscowAsia/AlmatyAmerica/New_YorkAustralia/SydneyНе рекомендуется использовать:
GMT+5
UTC+3
Такие обозначения не учитывают:
Moment.js находится в режиме поддержки и не развивается активно. Для новых проектов часто используются:
Тем не менее Moment.js остаётся важной библиотекой: