В 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, который
расширяет поведение базового объекта Day.js:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
После подключения становится доступен метод utc(),
позволяющий переключать контекст времени в UTC-режим.
Создание времени в UTC осуществляется явно:
const timeUtc = dayjs.utc();
В этом случае текущее время интерпретируется как UTC-время, а не локальное.
Также возможно создание UTC-даты из строки:
const dateUtc = dayjs.utc('2026-05-23 10:00:00');
Такая строка интерпретируется как уже находящаяся в UTC, без смещения часового пояса.
Одним из ключевых механизмов Day.js является переключение между локальным и UTC-представлением одного и того же момента времени.
const local = dayjs('2026-05-23 10:00:00');
const converted = local.utc();
Метод utc() в данном случае не изменяет сам момент
времени, а лишь переключает режим отображения на UTC.
const backToLocal = converted.local();
Метод local() возвращает интерпретацию времени в
соответствии с локальным часовым поясом среды выполнения.
Важно, что внутреннее значение времени сохраняется; меняется только представление.
Форматирование даты зависит от текущего режима объекта.
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 и локальным временем
определяется контекстом объекта, а не строкой формата.
Метод toISOString() всегда возвращает значение в UTC,
независимо от текущего режима объекта:
const d = dayjs();
d.toISOString();
Даже если d создан в локальном режиме, результат будет
нормализован к UTC.
Это поведение важно для хранения данных, поскольку ISO-строки используются как универсальный формат обмена временем между системами.
В прикладной логике различают два уровня работы с временем:
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 не выполняет автоматическую корректировку летнего и зимнего времени при использовании UTC-режима, поскольку UTC не содержит переходов часовых поясов. В локальном режиме такие переходы учитываются через окружение JavaScript-движка.
При вычислениях:
dayjs('2026-03-30').add(1, 'day');
смещение часового пояса может влиять только на отображение результата, но не на сам момент времени.
Поведение можно рассматривать через несколько аспектов:
Приведение локального времени к 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-режим служит базовой моделью абсолютного времени. Локальный режим добавляет слой представления, зависящий от окружения выполнения.
Такой подход позволяет отделить хранение данных от их визуализации, минимизируя ошибки, связанные с часовыми поясами и региональными настройками систем.