Создание объектов с временной зоной

Moment.js предоставляет гибкие возможности для работы с датами и временем, включая создание объектов с учётом временных зон. Для этого используется расширение Moment Timezone, которое позволяет корректно обрабатывать локальное и глобальное время, а также выполнять конвертацию между часовыми поясами.

Подключение Moment Timezone

Для работы с временными зонами необходимо подключить дополнительный модуль moment-timezone:

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

После подключения доступны методы для создания и манипуляции датами с учётом временных зон.

Создание объекта Moment с заданной временной зоной

Базовый способ — использование функции 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.
  • Второй параметр — идентификатор временной зоны в формате IANA (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(), чтобы исходный объект оставался неизменным.
  • Смещение автоматически корректируется в соответствии с целевой зоной.
  • Конвертация учитывает летнее/зимнее время.

Работа с UTC и локальным временем

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

Кроме идентификаторов временных зон можно использовать числовые смещения от 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());

Это важно при динамическом выборе временной зоны, например, в веб-приложениях с пользовательскими настройками.

Важные нюансы и рекомендации

  • Всегда использовать идентификаторы IANA (Europe/Moscow, America/Los_Angeles) вместо аббревиатур (MSK, PST), так как аббревиатуры могут быть неоднозначны.
  • Для операций с несколькими зонами рекомендуется работать с UTC как с базовым временем и конвертировать в локальные зоны только при отображении.
  • Метод 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 с временной зоной обеспечивает гибкость при работе с международными приложениями, календарями и расписаниями, гарантируя точность и корректное учёт смещений и переходов на летнее/зимнее время.