Конвертация форматов

Одна из ключевых задач при работе с датами — преобразование внутренних представлений времени в человекочитаемые строки. В Day.js это реализуется через метод format(), который опирается на шаблоны, похожие на Moment.js, но с более компактной архитектурой.

Базовое форматирование:

import dayjs from 'dayjs';

dayjs().format(); 
// ISO-строка по умолчанию: 2026-05-23T12:34:56+00:00

Использование шаблонов

Day.js поддерживает токены форматирования:

dayjs().format('YYYY-MM-DD');
// 2026-05-23

Основные токены:

  • YYYY — полный год
  • MM — месяц с ведущим нулём
  • DD — день месяца
  • HH — часы (24-часовой формат)
  • mm — минуты
  • ss — секунды

Пример комбинированного формата:

dayjs().format('YYYY-MM-DD HH:mm:ss');
// 2026-05-23 14:05:10

Локализованное представление

При подключении локалей форматирование может учитывать язык:

import 'dayjs/locale/ru';
dayjs.locale('ru');

dayjs().format('DD MMMM YYYY');
// 23 мая 2026

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


Парсинг строк в дату

Преобразование строк в объект Day.js — один из самых частых сценариев при работе с API, формами и внешними источниками данных.

dayjs('2026-05-23');

Day.js автоматически интерпретирует ISO-форматы, однако для нестандартных строк требуется явное указание структуры через дополнительные плагины (например, CustomParseFormat).

Строгий парсинг

При подключении расширения можно задать формат:

import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);

dayjs('23/05/2026', 'DD/MM/YYYY');

Это позволяет избежать неоднозначностей, особенно при работе с региональными форматами.

Валидация результата

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

const d = dayjs('invalid date');

d.isValid(); // false

Валидация критична при обработке пользовательского ввода, где ошибки формата неизбежны.


Преобразование в JavaScript Date

Несмотря на собственный формат хранения, Day.js легко конвертируется в нативный объект Date.

const jsDate = dayjs().toDate();

Этот механизм используется при взаимодействии с:

  • браузерными API (например, setTimeout, Intl)
  • библиотеками визуализации
  • системными функциями JavaScript

Особенность заключается в том, что конвертация не теряет точности, но может приводить к изменениям в таймзоне при дальнейшей обработке.


Работа с Unix timestamp

Unix-время — универсальный формат хранения времени в секундах или миллисекундах.

Получение timestamp

dayjs().valueOf(); 
// миллисекунды

dayjs().unix(); 
// секунды

Разница принципиальна:

  • valueOf() — миллисекунды (стандарт JS)
  • unix() — секунды (Unix standard)

Создание даты из timestamp

dayjs(1716460800000);
dayjs.unix(1716460800);

Этот подход часто используется при работе с базами данных и REST API.


Преобразование между форматами строк

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

const d = dayjs('2026-05-23');

d.format('DD.MM.YYYY');
// 23.05.2026

Фактически происходит цепочка:

  1. Парсинг строки → внутренний объект
  2. Применение форматирования → выходная строка

Это делает библиотеку удобной для трансформации данных между слоями приложения.


Изменение формата без изменения значения

Форматирование не влияет на саму дату:

const d = dayjs('2026-05-23');

d.format('YYYY');
// 2026

d.format('DD/MM/YYYY');
// 23/05/2026

Объект остаётся неизменным, что соответствует принципу иммутабельности.


Форматирование с учётом времени

При необходимости можно расширять точность до миллисекунд:

dayjs().format('YYYY-MM-DD HH:mm:ss.SSS');
// 2026-05-23 14:05:10.123

Миллисекунды особенно важны в:

  • логировании
  • профилировании
  • синхронизации событий

Преобразование в JSON

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

JSON.stringify({
  date: dayjs()
});

Результат:

{
  "date": "2026-05-23T12:34:56.000Z"
}

Фактически вызывается toISOString().


ISO-строки как универсальный формат

ISO 8601 является стандартом обмена датами:

dayjs().toISOString();

Особенности:

  • всегда UTC
  • строгая структура
  • совместимость с большинством API

Пример:

2026-05-23T12:34:56.000Z

Преобразование с изменением часового пояса

Без дополнительных плагинов Day.js работает в локальной временной зоне среды выполнения. При использовании utc-расширения появляется возможность явно управлять конвертацией.

import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

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

Теперь строка интерпретируется как UTC-время.


Форматирование для внешних систем

При интеграции с API часто требуется строгий формат:

Для HTTP-заголовков

dayjs().toISOString();

Для SQL

dayjs().format('YYYY-MM-DD HH:mm:ss');

Для логов

dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ');

Каждый формат соответствует требованиям конкретной системы хранения или передачи данных.


Преобразование относительных данных в абсолютные

Часто входные данные содержат относительные конструкции:

  • «сейчас»
  • «через 2 дня»
  • «вчера»

Day.js преобразует их через цепочку методов:

dayjs().add(2, 'day').format('YYYY-MM-DD');

или

dayjs().subtract(1, 'day').format();

Хотя это не прямой парсинг строки, концептуально это часть конвертации форматов времени.


Нормализация входных данных

При обработке внешних источников часто требуется привести разные форматы к единому виду:

const normalized = dayjs(input).format('YYYY-MM-DD');

Где input может быть:

  • ISO-строкой
  • timestamp
  • пользовательским форматом

Day.js выполняет унификацию в один внутренний формат, после чего применяется единое правило вывода.


Потеря и сохранение точности при конвертации

Важно учитывать особенности преобразований:

  • при format() точность сохраняется полностью
  • при toDate() возможны ограничения JavaScript Date
  • при unix() происходит округление до секунд
dayjs().millisecond(123).unix(); 
// миллисекунды теряются

Это критично при системах, где важна высокая точность временных меток.


Двойная конвертация форматов

Типичный сценарий в приложениях:

const apiDate = dayjs(input)
  .utc()
  .format('YYYY-MM-DDTHH:mm:ss[Z]');

Здесь выполняется:

  1. Парсинг входа
  2. Приведение к UTC
  3. Форматирование в ISO-подобную строку

Такой подход обеспечивает стабильность данных при передаче между сервисами.