Получение информации о зоне

При работе с датой и временем недостаточно хранить только календарную дату и часы. Одно и то же значение времени может означать разные моменты в зависимости от часового пояса. Для решения этой задачи в экосистеме 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

В объекте сохраняется:

  • локальное время;
  • смещение относительно UTC;
  • информация о временной зоне.

Получение названия временной зоны

Метод 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());

Получение смещения относительно UTC

Метод 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

moment().utcOffset()

Результат:

180

У объекта Zone

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

Форматирование зоны в строке

Формат Z

const date = moment.tz(
    "Asia/Tokyo"
);

console.log(date.format("Z"));

Результат:

+09:00

Формат ZZ

console.log(date.format("ZZ"));

Результат:

+0900

Получение информации о UTC

Метод isUTC()

const utcDate = moment.utc();

console.log(utcDate.isUTC());

Результат:

true

Работа с UTC и локальной зоной

const utc = moment.utc();

console.log(utc.format());

Результат:

2026-05-21T10:00:00Z

Преобразование в локальную зону:

console.log(
    utc.local().format()
);

Получение текущего UTC-смещения локальной системы

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/Moscow
  • Asia/Almaty
  • America/New_York
  • Australia/Sydney

Не рекомендуется использовать:

GMT+5
UTC+3

Такие обозначения не учитывают:

  • летнее время;
  • исторические изменения;
  • региональные правила.

Ограничения Moment.js

Moment.js находится в режиме поддержки и не развивается активно. Для новых проектов часто используются:

  • Luxon;
  • Day.js;
  • date-fns;
  • Temporal API.

Тем не менее Moment.js остаётся важной библиотекой:

  • в существующих проектах;
  • в legacy-системах;
  • при поддержке старого кода;
  • в приложениях с большим количеством зависимостей от Moment Timezone.