Конвертация между зонами

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


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

Временная зона определяет смещение относительно всемирного координированного времени (UTC). В Moment.js работа с временными зонами разделяется на несколько ключевых понятий:

  • Local Time – локальное время системы, на которой выполняется код.
  • UTC Time – универсальное координированное время.
  • Time Zone – географически определённая зона, например, Europe/Moscow или America/New_York.

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


Конвертация локального времени в UTC

Для преобразования локального времени в UTC используется метод .utc():

const moment = require('moment');

let localTime = moment('2026-05-21 15:30'); // локальное время
let utcTime = localTime.utc();

console.log(localTime.format()); // 2026-05-21T15:30:00+03:00 (например, Москва)
console.log(utcTime.format());   // 2026-05-21T12:30:00Z

Ключевые моменты:

  • .utc() не изменяет исходный объект, если используется без присваивания.
  • При использовании .format() на объекте UTC добавляется символ Z, обозначающий время в UTC.

Конвертация между часовыми поясами с moment-timezone

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

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

let moscowTime = moment.tz('2026-05-21 15:30', 'Europe/Moscow');
let newYorkTime = moscowTime.clone().tz('America/New_York');

console.log(moscowTime.format());  // 2026-05-21T15:30:00+03:00
console.log(newYorkTime.format()); // 2026-05-21T08:30:00-04:00

Особенности конвертации:

  • Метод .tz() создаёт новый объект с указанной временной зоной.
  • Использование .clone() позволяет сохранить исходное значение без изменения.
  • Moment-timezone учитывает летнее и зимнее время, корректно применяя смещения.

Преобразование даты и времени из строки с указанием временной зоны

Если дата приходит в формате с часовым поясом, Moment.js может её корректно распознать:

let dateString = '2026-05-21T15:30:00+03:00';
let m = moment.parseZone(dateString);

console.log(m.format());      // 2026-05-21T15:30:00+03:00
console.log(m.utc().format()); // 2026-05-21T12:30:00Z

Особенности метода .parseZone():

  • Сохраняет исходное смещение, указанное в строке.
  • Позволяет безопасно конвертировать даты в другие зоны, сохраняя корректность времени.

Конвертация между UTC и локальным временем с учётом зоны пользователя

Для вывода времени в локальной зоне пользователя используется метод .local():

let utcTime = moment.utc('2026-05-21T12:30:00Z');
let localTime = utcTime.local();

console.log(localTime.format()); // 2026-05-21T15:30:00+03:00 (Москва)

Особенности:

  • .local() преобразует UTC-время в локальное, учитывая системный часовой пояс.
  • Полезно для отображения времени в интерфейсе с учётом местоположения пользователя.

Вычисление времени между зонами

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

let tokyo = moment.tz('2026-05-21 15:30', 'Asia/Tokyo');
let london = tokyo.clone().tz('Europe/London');

let diffHours = london.utcOffset() - tokyo.utcOffset();
console.log(diffHours); // Разница в минутах между зонами

Особенности расчётов:

  • Метод .utcOffset() возвращает смещение в минутах.
  • Разница смещений позволяет вычислять корректные значения при пересечении зон.

Практические рекомендации

  • Всегда использовать moment-timezone, если приложение работает с несколькими регионами.
  • Не изменять объект Moment напрямую при конвертации — использовать .clone().
  • Для хранения данных в базе данных предпочтительно использовать UTC, а для отображения — локальные зоны пользователя.
  • Учитывать переходы на летнее и зимнее время, которые Moment.js корректно обрабатывает через временные зоны.

Работа с Moment.js и временными зонами позволяет создавать приложения с точным отображением времени для любой точки мира, обеспечивая корректные конвертации и удобство вычислений.