Стандартные форматы дат

Базовое поведение разбора дат

Day.js опирается на упрощённую, но предсказуемую модель работы с датами: входные строки интерпретируются либо как строка в стандарте ISO 8601, либо как значения, совместимые с конструктором Date в JavaScript.

Основной принцип заключается в следующем:

  • строка в формате ISO 8601 распознаётся стабильно и без дополнительных настроек;
  • все остальные форматы могут интерпретироваться через встроенный Date, поведение которого зависит от окружения;
  • при неоднозначных строках возможны различия между платформами.
import dayjs from 'dayjs';

dayjs('2026-05-23'); 
// ISO 8601: корректный разбор

dayjs('2026-05-23T10:15:30');
// ISO с временем: также корректно

ISO-строки являются опорной точкой, вокруг которой строится предсказуемость всей системы.


Поддерживаемые стандартные входные форматы

Day.js без расширений способен интерпретировать ограниченный набор стандартных представлений даты:

1. ISO 8601 (основной стандарт) Наиболее надёжный формат:

  • YYYY-MM-DD
  • YYYY-MM-DDTHH:mm:ss
  • YYYY-MM-DDTHH:mm:ssZ
dayjs('2026-01-10');
dayjs('2026-01-10T12:30:00Z');

Особенность заключается в том, что символ Z фиксирует UTC-время, исключая локальные смещения.


2. Формат, совместимый с JavaScript Date

Если строка не соответствует ISO, Day.js передаёт её в new Date():

dayjs('May 23 2026 10:30:00');
dayjs('2026/05/23');

Такой подход обеспечивает совместимость, но снижает предсказуемость. Разные движки JavaScript могут интерпретировать такие строки по-разному.


3. Timestamp (Unix-время)

Числовое значение интерпретируется как миллисекунды от Unix-эпохи:

dayjs(1716451200000);

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

dayjs.unix(1716451200);

Форматирование дат в Day.js

Выходной формат формируется через метод format(), использующий набор токенов.

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

Основные стандартные токены:

Токен Значение
YYYY год (4 цифры)
YY год (2 цифры)
MM месяц (01–12)
DD день месяца
HH часы (24-часовой формат)
mm минуты
ss секунды

Примеры стандартного форматирования:

dayjs('2026-05-23T14:45:00').format('YYYY-MM-DD');
// 2026-05-23

dayjs('2026-05-23T14:45:00').format('DD.MM.YYYY');
// 23.05.2026

dayjs('2026-05-23T14:45:00').format('HH:mm');
// 14:45

Влияние локали на стандартные форматы

Day.js поддерживает локализацию, которая влияет на отображение месяцев, дней недели и некоторых текстовых представлений.

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

При использовании локалей:

  • числовые форматы остаются неизменными;
  • текстовые элементы (например, месяцы) изменяются;
  • базовые ISO-представления не зависят от локали.
dayjs().format('D MMMM YYYY');
// 23 мая 2026

Разбор нестандартных строк

Если строка не соответствует ISO и не является валидной для Date, результат становится некорректным:

dayjs('not-a-date').isValid(); 
// false

Day.js не пытается «угадывать» сложные форматы без дополнительного плагина customParseFormat.


Плагин Custom Parse Format

Для строгого контроля форматов подключается расширение:

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

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

dayjs('23-05-2026', 'DD-MM-YYYY');
dayjs('14:30:00', 'HH:mm:ss');

Это устраняет неопределённость стандартного парсинга.


RFC2822 и совместимые строки

Некоторые строковые представления даты соответствуют RFC2822 и также могут быть разобраны:

dayjs('Sat, 23 May 2026 10:30:00 GMT');

Однако поддержка таких строк зависит от реализации Date в среде выполнения.


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

Day.js стремится привести все входные данные к единому внутреннему представлению:

  • строки → парсинг через ISO или Date;
  • числа → Unix timestamp;
  • объекты Date → прямое использование.
dayjs(new Date());
dayjs(Date.now());
dayjs('2026-05-23');

Внутренне все варианты преобразуются в момент времени в миллисекундах.


Форматы с часовыми поясами

Стандарт ISO допускает указание временной зоны:

dayjs('2026-05-23T10:00:00+03:00');

Смещение учитывается при преобразовании в локальное время или UTC (при использовании соответствующих плагинов).


Строгость интерпретации ISO

ISO-формат рассматривается как эталонный:

  • фиксированная структура;
  • отсутствие зависимости от локали;
  • однозначная интерпретация.

Примеры корректных ISO-строк:

dayjs('2026-05-23');
dayjs('2026-05-23T12:00:00');
dayjs('2026-05-23T12:00:00Z');
dayjs('2026-05-23T12:00:00+05:00');

Любые отклонения от структуры могут привести к частичному или некорректному разбору.


Преобразование и обратное форматирование

После парсинга дата может быть преобразована в стандартные строковые представления:

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

d.toISOString();
// 2026-05-23T14:30:00.000Z

d.format('YYYY-MM-DD HH:mm:ss');
// локализованное отображение

ISO-строка, возвращаемая toISOString(), соответствует строгому стандарту и используется для обмена данными между системами.


Поведение при некорректных форматах

Если входное значение не может быть интерпретировано:

dayjs('invalid').isValid(); // false

Все последующие операции над такой датой сохраняют состояние невалидности, не вызывая исключений.

dayjs('invalid').format('YYYY-MM-DD');
// Invalid Date