Поддержка временных зон в Moment.js реализуется через
дополнительный модуль moment-timezone. Базовая библиотека
умеет работать только с локальным временем и UTC, но не содержит полного
списка мировых временных зон.
Для использования временных зон требуется отдельная установка:
npm install moment moment-timezone
Подключение:
const moment = require('moment-timezone');
или в ES-модулях:
import moment from 'moment-timezone';
Временная зона — это правило отображения локального времени для определённого региона с учётом:
Например:
| Зона | Смещение |
|---|---|
| Europe/Moscow | UTC+3 |
| Asia/Almaty | UTC+5 |
| America/New_York | UTC-5 / UTC-4 |
| Asia/Tokyo | UTC+9 |
Moment.js использует базу данных IANA Time Zone Database — международный стандарт хранения временных зон.
Метод moment.tz.names() возвращает массив всех
поддерживаемых зон.
const zones = moment.tz.names();
console.log(zones);
Результат:
[
'Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'America/New_York',
'Asia/Almaty',
'Europe/Moscow'
]
const zones = moment.tz.names();
console.log(zones.length);
Пример вывода:
597
Количество зависит от версии базы временных зон.
forEachmoment.tz.names().forEach(zone => {
console.log(zone);
});
for...offor (const zone of moment.tz.names()) {
console.log(zone);
}
const europeanZones = moment.tz.names().filter(zone => {
return zone.startsWith('Europe/');
});
console.log(europeanZones);
Результат:
[
'Europe/Amsterdam',
'Europe/Berlin',
'Europe/London',
'Europe/Moscow'
]
const asianZones = moment.tz.names().filter(zone => {
return zone.startsWith('Asia/');
});
console.log(asianZones);
const moscowZones = moment.tz.names().filter(zone => {
return zone.includes('Moscow');
});
console.log(moscowZones);
Метод moment.tz.zone() возвращает объект зоны либо
null.
const zone = moment.tz.zone('Europe/Moscow');
console.log(zone);
Если зона не существует:
const zone = moment.tz.zone('Invalid/Zone');
console.log(zone);
Результат:
null
function isValidTimezone(name) {
return moment.tz.zone(name) !== null;
}
console.log(isValidTimezone('Asia/Almaty'));
console.log(isValidTimezone('Mars/Colony'));
Результат:
true
false
Объект зоны содержит подробные сведения.
const zone = moment.tz.zone('Europe/Moscow');
console.log(zone);
Пример структуры:
{
name: 'Europe/Moscow',
abbrs: [...],
untils: [...],
offsets: [...],
population: 16100000
}
const zone = moment.tz.zone('Asia/Tokyo');
console.log(zone.name);
Результат:
Asia/Tokyo
Метод utcOffset() возвращает смещение в минутах.
const offset = moment.tz.zone('Europe/Moscow').utcOffset(Date.now());
console.log(offset);
Результат:
-180
Moment.js хранит смещение в обратном знаке:
| Реальное время | Результат |
|---|---|
| UTC+3 | -180 |
| UTC-5 | 300 |
const offsetMinutes =
moment.tz.zone('Asia/Almaty').utcOffset(Date.now());
const offsetHours = -offsetMinutes / 60;
console.log(offsetHours);
Результат:
5
Метод abbr() возвращает сокращённое название зоны.
const zone = moment.tz.zone('America/New_York');
const abbr = zone.abbr(Date.now());
console.log(abbr);
Результат:
EST
или:
EDT
в зависимости от сезона.
const date = moment.tz(
'2026-05-21 15:00',
'Asia/Almaty'
);
console.log(date.format());
Результат:
2026-05-21T15:00:00+05:00
const date = moment.tz(
'2026-05-21 15:00',
'Europe/Moscow'
);
const tokyo = date.clone().tz('Asia/Tokyo');
console.log(tokyo.format());
const now = moment();
moment.tz.names().forEach(zone => {
const time = now.clone().tz(zone);
console.log(
zone,
time.format('YYYY-MM-DD HH:mm:ss')
);
});
const timezoneList = moment.tz.names().map(zone => {
return {
value: zone,
label: zone
};
});
console.log(timezoneList);
const timezoneList = moment.tz.names().map(zone => {
const offset =
-moment.tz.zone(zone).utcOffset(Date.now()) / 60;
return {
zone,
offset
};
});
console.log(timezoneList);
function formatOffset(offset) {
const sign = offset >= 0 ? '+' : '-';
const hours = String(Math.floor(Math.abs(offset)))
.padStart(2, '0');
const minutes = String(
(Math.abs(offset) % 1) * 60
).padStart(2, '0');
return `UTC${sign}${hours}:${minutes}`;
}
console.log(formatOffset(5));
console.log(formatOffset(-3));
Результат:
UTC+05:00
UTC-03:00
const zones = moment.tz.names().map(zone => {
const offset =
-moment.tz.zone(zone).utcOffset(Date.now()) / 60;
return {
zone,
utc: formatOffset(offset)
};
});
console.log(zones);
Пример результата:
[
{
zone: 'Europe/Moscow',
utc: 'UTC+03:00'
},
{
zone: 'Asia/Tokyo',
utc: 'UTC+09:00'
}
]
const sortedZones = moment.tz.names()
.map(zone => {
return {
zone,
offset:
-moment.tz.zone(zone)
.utcOffset(Date.now())
};
})
.sort((a, b) => a.offset - b.offset);
console.log(sortedZones);
Метод guess() пытается определить часовую зону
автоматически.
const userZone = moment.tz.guess();
console.log(userZone);
Пример результата:
Asia/Almaty
const zone = moment.tz.guess();
const now = moment().tz(zone);
console.log(now.format());
const popularZones = [
'UTC',
'Europe/London',
'Europe/Berlin',
'Europe/Moscow',
'Asia/Almaty',
'Asia/Tokyo',
'America/New_York',
'America/Los_Angeles'
];
const utcDate = moment.utc();
console.log(utcDate.format());
const local = moment.utc()
.tz('Asia/Almaty');
console.log(local.format());
| UTC | Временная зона |
|---|---|
| Универсальное время | Региональное время |
| Не меняется | Может менять смещение |
| Нет DST | Возможен DST |
DST — переход на летнее/зимнее время.
Некоторые зоны меняют смещение в течение года.
const winter = moment.tz(
'2026-01-15',
'America/New_York'
);
const summer = moment.tz(
'2026-07-15',
'America/New_York'
);
console.log(winter.format('Z'));
console.log(summer.format('Z'));
Результат:
-05:00
-04:00
const cities = [
'Europe/London',
'Europe/Moscow',
'Asia/Tokyo',
'Asia/Almaty',
'America/New_York'
];
cities.forEach(city => {
const time = moment().tz(city);
console.log(
city,
time.format('HH:mm:ss')
);
});
const select = document.createElement('select');
moment.tz.names().forEach(zone => {
const option = document.createElement('option');
option.value = zone;
option.textContent = zone;
select.appendChild(option);
});
document.body.appendChild(select);
Некоторые временные зоны являются историческими или устаревшими.
Пример:
US/Pacific
Современный вариант:
America/Los_Angeles
const zones = moment.tz.names();
function TimezoneSelect() {
return (
<select>
{zones.map(zone => (
<option key={zone} value={zone}>
{zone}
</option>
))}
</select>
);
}
function getCurrentTime(zone) {
return moment()
.tz(zone)
.format('YYYY-MM-DD HH:mm:ss');
}
console.log(
getCurrentTime('Europe/Moscow')
);
const timestamp = 1780000000;
const date = moment
.unix(timestamp)
.tz('Asia/Tokyo');
console.log(date.format());
const moscowTime = moment.tz(
'2026-05-21 12:00',
'Europe/Moscow'
);
const newYorkTime =
moscowTime.clone().tz('America/New_York');
console.log(
newYorkTime.format('YYYY-MM-DD HH:mm')
);
moment.tz.setDefault('Asia/Almaty');
После этого все новые объекты Moment будут использовать указанную временную зону.
moment.tz.setDefault();
console.log(
moment.defaultZone.name
);
| Метод | Назначение |
|---|---|
| moment.tz.names() | список зон |
| moment.tz.zone() | объект зоны |
| moment.tz.guess() | определение зоны |
| moment.tz.setDefault() | установка зоны по умолчанию |
| moment().tz() | смена зоны |
| utcOffset() | получение смещения |
| abbr() | сокращение зоны |
Две зоны могут иметь одинаковое смещение, но разные правила DST.
Пример:
Europe/Berlin
Africa/Lagos
В определённые периоды времени смещение совпадает, но переходы на летнее время различаются.
Неправильно:
UTC+3
Правильно:
Europe/Moscow
Полное название зоны содержит правила изменения времени.
Государства периодически меняют:
Поэтому важно обновлять moment-timezone.
npm update moment-timezone
Неправильно:
moment('2026-05-21 10:00')
Правильно:
moment.tz(
'2026-05-21 10:00',
'Europe/Moscow'
)
Неправильно:
2026-05-21 10:00
Правильно:
2026-05-21T10:00:00+03:00
или:
{
datetime: '2026-05-21 10:00',
timezone: 'Europe/Moscow'
}
При ручной работе со смещением легко получить ошибку.
Неправильно:
UTC-5
Правильно:
America/New_York
Поскольку зимой и летом смещение отличается.