Получение смещения

В 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 — UTC
  • 60 — 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-плагином

Для корректной работы со смещениями часто используется плагин 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 — изменение представления времени

Частые сценарии использования

Работа со смещениями особенно важна в следующих случаях:

  • синхронизация времени между сервером и клиентом
  • отображение локального времени пользователя
  • обработка событий из разных часовых поясов
  • хранение времени в UTC с последующей локализацией

Особенности и ограничения

Смещение не учитывает правила перехода на летнее время напрямую. 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 минут.

Если смещение отсутствует, используется локальная временная зона окружения.


Поведение в разных средах выполнения

Смещение зависит от окружения:

  • браузер — системная временная зона пользователя
  • Node.js — временная зона сервера

Это приводит к различиям в результатах utcOffset() при одинаковом коде, если явно не зафиксировать зону или UTC-режим.