В Day.js смещение временной зоны (UTC offset) представляет собой разницу в минутах между локальным временем и UTC. Это значение используется для вычисления локального времени относительно нулевого меридиана и играет ключевую роль при преобразованиях дат между часовыми поясами.
Внутренне смещение хранится как число, выраженное в минутах. Положительные значения означают, что локальное время опережает UTC, отрицательные — отстаёт.
Для получения текущего смещения используется метод
utcOffset() без аргументов.
import dayjs from 'dayjs';
const now = dayjs();
const offset = now.utcOffset();
console.log(offset);
Результатом будет число, например:
-180
Это означает, что текущее локальное время отстаёт от UTC на 180 минут (UTC+3 или UTC-3 в зависимости от знака интерпретации в контексте среды).
Значение, возвращаемое utcOffset(), всегда измеряется в
минутах:
0 — UTC60 — UTC+1-120 — UTC-2Для удобства преобразования в часы используется деление:
const hours = offset / 60;
Метод utcOffset() может работать как сеттер, если
передать ему аргумент.
const d = dayjs().utcOffset(120);
console.log(d.format());
В этом примере время будет интерпретировано как UTC+2.
Важно понимать, что установка смещения не изменяет момент времени в абсолютном смысле, а лишь меняет его представление.
Day.js поддерживает строковый формат, аналогичный ISO 8601:
dayjs().utcOffset('+05:00');
dayjs().utcOffset('-03:30');
Такой формат удобен при работе с API, которые возвращают временные зоны в виде строк.
При изменении смещения Day.js перерасчитывает отображаемое локальное время, сохраняя исходный timestamp.
const base = dayjs('2026-01-01T12:00:00Z');
const shifted = base.utcOffset(180);
console.log(base.format());
console.log(shifted.format());
Оба объекта представляют один и тот же момент времени, но отображаются в разных временных зонах.
Для корректной работы со смещениями часто используется плагин
utc.
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
С его помощью можно явно переключаться между UTC и локальным временем:
dayjs.utc().utcOffset();
При использовании utc() базовая точка отсчёта
фиксируется, и смещения становятся более предсказуемыми при цепочках
преобразований.
Day.js позволяет отображать смещение через форматирование:
dayjs().format('Z'); // +03:00
dayjs().format('ZZ'); // +0300
Z — формат с двоеточиемZZ — компактный формат без разделителяЭто полезно при генерации строк для API или логирования.
Если необходимо изменить только смещение без сдвига самого момента
времени, используется параметр true:
dayjs().utcOffset(120, true);
В этом режиме меняется интерпретация времени, но не сам timestamp.
Разница:
true — пересчёт абсолютного времениtrue — изменение представления времениРабота со смещениями особенно важна в следующих случаях:
Смещение не учитывает правила перехода на летнее время напрямую.
Day.js хранит фиксированное значение offset, поэтому динамические
изменения часовых поясов требуют дополнительных инструментов, таких как
timezone плагин.
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(timezone);
С его помощью можно работать с именованными зонами:
dayjs().tz('Europe/Moscow').utcOffset();
Разница смещений может использоваться для определения различий часовых поясов:
const a = dayjs().utcOffset();
const b = dayjs().add(1, 'day').utcOffset();
const diff = b - a;
Это полезно при анализе переходов между зонами или при работе с историческими данными.
При разборе строк с указанием смещения Day.js автоматически учитывает его:
dayjs('2026-01-01T12:00:00+04:00').utcOffset();
В этом случае смещение будет установлено на +240 минут.
Если смещение отсутствует, используется локальная временная зона окружения.
Смещение зависит от окружения:
Это приводит к различиям в результатах utcOffset() при
одинаковом коде, если явно не зафиксировать зону или UTC-режим.