Список временных зон

Поддержка временных зон в Moment.js реализуется через дополнительный модуль moment-timezone. Базовая библиотека умеет работать только с локальным временем и UTC, но не содержит полного списка мировых временных зон.

Для использования временных зон требуется отдельная установка:

npm install moment moment-timezone

Подключение:

const moment = require('moment-timezone');

или в ES-модулях:

import moment from 'moment-timezone';

Что такое временная зона

Временная зона — это правило отображения локального времени для определённого региона с учётом:

  • смещения относительно UTC;
  • переходов на летнее и зимнее время;
  • исторических изменений времени.

Например:

Зона Смещение
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

Количество зависит от версии базы временных зон.


Перебор списка временных зон

Использование forEach

moment.tz.names().forEach(zone => {
  console.log(zone);
});

Использование цикла for...of

for (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

Смещение относительно UTC

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

Создание списка с UTC-смещением

const timezoneList = moment.tz.names().map(zone => {
  const offset =
    -moment.tz.zone(zone).utcOffset(Date.now()) / 60;

  return {
    zone,
    offset
  };
});

console.log(timezoneList);

Форматирование смещения UTC

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'
  }
]

Сортировка временных зон по UTC

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

Использование guessed timezone

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'
];

Работа с UTC

Создание UTC-даты

const utcDate = moment.utc();

console.log(utcDate.format());

Перевод UTC в локальную временную зону

const local = moment.utc()
  .tz('Asia/Almaty');

console.log(local.format());

Отличие UTC от временной зоны

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

Использование списка зон с React

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')
);

Работа с Unix Timestamp и временными зонами

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')
);

Использование default timezone

Установка глобальной зоны

moment.tz.setDefault('Asia/Almaty');

После этого все новые объекты Moment будут использовать указанную временную зону.


Сброс глобальной зоны

moment.tz.setDefault();

Проверка текущей default timezone

console.log(
  moment.defaultZone.name
);

Основные методы работы с временными зонами

Метод Назначение
moment.tz.names() список зон
moment.tz.zone() объект зоны
moment.tz.guess() определение зоны
moment.tz.setDefault() установка зоны по умолчанию
moment().tz() смена зоны
utcOffset() получение смещения
abbr() сокращение зоны

Особенности работы временных зон

Временные зоны — это не только UTC-смещение

Две зоны могут иметь одинаковое смещение, но разные правила DST.

Пример:

Europe/Berlin
Africa/Lagos

В определённые периоды времени смещение совпадает, но переходы на летнее время различаются.


Нельзя хранить только UTC offset

Неправильно:

UTC+3

Правильно:

Europe/Moscow

Полное название зоны содержит правила изменения времени.


Временные зоны регулярно обновляются

Государства периодически меняют:

  • смещение UTC;
  • правила DST;
  • название зон.

Поэтому важно обновлять moment-timezone.

npm update moment-timezone

Типичные ошибки

Использование локального времени вместо 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'
}

Игнорирование DST

При ручной работе со смещением легко получить ошибку.

Неправильно:

UTC-5

Правильно:

America/New_York

Поскольку зимой и летом смещение отличается.