UTC и локальное время

В Day.js работа с временем опирается на различие между локальным часовым поясом среды выполнения и универсальным координированным временем (UTC). Библиотека изначально использует локальное время системы, а поддержка UTC включается через отдельный плагин, поскольку базовый API Day.js минималистичен и расширяется только при необходимости.

При создании объекта времени без дополнительных плагинов Day.js интерпретирует значения как локальные:

import dayjs from 'dayjs';

const now = dayjs();

Такой объект отражает текущее время операционной системы. Все операции форматирования и арифметики времени по умолчанию выполняются в локальном контексте.

Парсинг строк также наследует локальное поведение:

const date = dayjs('2026-05-23 10:00:00');

Если строка не содержит информации о часовом поясе, она трактуется как локальная дата и время.

Ключевая особенность локального режима заключается в том, что Day.js не выполняет автоматической нормализации к UTC. Это означает, что два одинаковых момента времени могут иметь различное отображение в зависимости от системы, на которой выполняется код.

Подключение UTC-плагина

Поддержка UTC реализуется через плагин utc, который расширяет поведение базового объекта Day.js:

import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';

dayjs.extend(utc);

После подключения становится доступен метод utc(), позволяющий переключать контекст времени в UTC-режим.

Создание объектов в UTC

Создание времени в UTC осуществляется явно:

const timeUtc = dayjs.utc();

В этом случае текущее время интерпретируется как UTC-время, а не локальное.

Также возможно создание UTC-даты из строки:

const dateUtc = dayjs.utc('2026-05-23 10:00:00');

Такая строка интерпретируется как уже находящаяся в UTC, без смещения часового пояса.

Преобразование между UTC и локальным временем

Одним из ключевых механизмов Day.js является переключение между локальным и UTC-представлением одного и того же момента времени.

Перевод в UTC

const local = dayjs('2026-05-23 10:00:00');
const converted = local.utc();

Метод utc() в данном случае не изменяет сам момент времени, а лишь переключает режим отображения на UTC.

Возврат в локальное время

const backToLocal = converted.local();

Метод local() возвращает интерпретацию времени в соответствии с локальным часовым поясом среды выполнения.

Важно, что внутреннее значение времени сохраняется; меняется только представление.

Форматирование UTC и локального времени

Форматирование даты зависит от текущего режима объекта.

const d1 = dayjs('2026-05-23 10:00:00');

d1.format(); 

Вывод будет соответствовать локальному времени.

При переключении в UTC:

const d2 = dayjs.utc('2026-05-23 10:00:00');

d2.format();

Результат отражает UTC-интерпретацию времени.

Day.js не добавляет автоматически суффикс Z при форматировании, поэтому различие между UTC и локальным временем определяется контекстом объекта, а не строкой формата.

ISO-строки и UTC

Метод toISOString() всегда возвращает значение в UTC, независимо от текущего режима объекта:

const d = dayjs();

d.toISOString();

Даже если d создан в локальном режиме, результат будет нормализован к UTC.

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

Различие между хранением и отображением времени

В прикладной логике различают два уровня работы с временем:

  • хранение момента времени (instant)
  • отображение времени пользователю (representation)

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

Пример:

const saved = dayjs('2026-05-23 10:00:00').utc();

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

saved.format();       // UTC-вид
saved.local().format(); // локальный вид

Парсинг строк с часовыми поясами

Если строка содержит обозначение UTC, Day.js корректно интерпретирует её:

const d = dayjs('2026-05-23T10:00:00Z');

Символ Z указывает на нулевое смещение относительно UTC.

В этом случае дополнительный вызов utc() не изменяет смысл времени, поскольку он уже определён.

Особенности работы с датами без временной зоны

Строки без указания зоны:

dayjs('2026-05-23 10:00:00')

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

Перевод в UTC устраняет неоднозначность:

dayjs('2026-05-23 10:00:00').utc().format();

Day.js и смещения времени

Day.js не выполняет автоматическую корректировку летнего и зимнего времени при использовании UTC-режима, поскольку UTC не содержит переходов часовых поясов. В локальном режиме такие переходы учитываются через окружение JavaScript-движка.

При вычислениях:

dayjs('2026-03-30').add(1, 'day');

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

Сравнение UTC и локального режима

Поведение можно рассматривать через несколько аспектов:

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

Типовые сценарии преобразований

Приведение локального времени к UTC:

const utcTime = dayjs().utc();

Преобразование UTC в локальное:

const localTime = dayjs.utc().local();

Фиксация времени для передачи между системами:

const payload = {
  createdAt: dayjs().utc().toISOString()
};

Поведение при цепочках вызовов

Методы Day.js сохраняют иммутабельность. Каждый вызов возвращает новый объект:

const base = dayjs();
const utcVersion = base.utc();
const formatted = utcVersion.local().format();

Каждое преобразование создаёт новую интерпретацию, не изменяя исходное значение.

Интерпретация временной шкалы

UTC-режим служит базовой моделью абсолютного времени. Локальный режим добавляет слой представления, зависящий от окружения выполнения.

Такой подход позволяет отделить хранение данных от их визуализации, минимизируя ошибки, связанные с часовыми поясами и региональными настройками систем.