Moment.js предоставляет мощные инструменты для работы с датами и временем, включая корректное определение перехода на летнее/зимнее время (DST, Daylight Saving Time). Этот процесс особенно важен при разработке приложений, где точное вычисление временных интервалов критично для корректной работы расписаний, уведомлений и логирования событий.
Moment.js использует объекты moment совместно с
временными зонами, предоставляемыми библиотекой
moment-timezone, для корректной проверки DST. Основной
принцип заключается в том, что объект времени может быть проверен на
наличие летнего времени через метод .isDST().
const moment = require('moment-timezone');
const date = moment.tz("2026-06-21", "Europe/Moscow");
console.log(date.isDST()); // false, так как Россия не использует DST
Ключевой момент: isDST() возвращает
true, если дата находится в периоде летнего времени, и
false — если нет.
Для выявления точного момента начала и окончания летнего времени можно использовать метод сравнения смещения временной зоны в разные даты:
const startOfYear = moment.tz("2026-01-01", "Europe/London");
const midYear = moment.tz("2026-07-01", "Europe/London");
const offsetStart = startOfYear.utcOffset(); // смещение в начале года
const offsetMid = midYear.utcOffset(); // смещение в середине года
const dstActive = offsetMid > offsetStart; // true, если в середине года действует DST
Здесь используется метод .utcOffset(), который
возвращает смещение от UTC в минутах. Разница в смещении позволяет
определить, активен ли переход на летнее время.
Moment.js в сочетании с moment-timezone позволяет не только проверять DST, но и правильно рассчитывать даты при смене часового пояса:
const newYorkTime = moment.tz("2026-03-14 02:00", "America/New_York");
console.log(newYorkTime.format()); // "2026-03-14T03:00:00-04:00"
console.log(newYorkTime.isDST()); // true
Важно учитывать: при переходе на летнее время часы «перескакивают» вперед, и локальное время может не существовать (например, 2:00–3:00 утра в примере Нью-Йорка). Moment.js корректно обрабатывает такие случаи, автоматически смещая дату и время.
Для корректного вычисления интервалов, охватывающих смену времени, необходимо использовать объекты moment с привязкой к таймзоне:
const start = moment.tz("2026-03-13 12:00", "America/New_York");
const end = moment.tz("2026-03-15 12:00", "America/New_York");
const durationHours = end.diff(start, 'hours');
console.log(durationHours); // 48 часов, учитывая переход на летнее время
Метод .diff() автоматически учитывает смещение часового
пояса и DST, обеспечивая корректный расчет разницы даже при пересечении
переходного периода.
.isDST() — проверка, находится ли момент времени в
летнем времени..utcOffset() — получение смещения от UTC для сравнения
периодов..tz() — создание объекта moment с привязкой к
конкретной временной зоне..diff() — вычисление интервалов с учетом DST.Moment.js и moment-timezone совместно обеспечивают точное и надежное управление летним временем, упрощая разработку приложений, где важна корректная работа с часами и календарными событиями.