ISO 8601 представляет собой международный стандарт описания даты и времени, ориентированный на однозначность, машинную интерпретируемость и независимость от локальных форматов. В контексте JavaScript и библиотеки Day.js этот стандарт выступает базовым форматом для обмена временными данными между системами, API и хранилищами данных.
Ключевая особенность ISO 8601 — строгая структура строки даты и времени:
YYYY-MM-DD — календарная датаYYYY-MM-DDTHH:mm:ss — дата и времяYYYY-MM-DDTHH:mm:ssZ — UTC-времяYYYY-MM-DDTHH:mm:ss+HH:mm — время с часовым
смещениемСимвол T разделяет дату и время, а Z
обозначает нулевое смещение (UTC).
Day.js изначально поддерживает ISO 8601 без дополнительных плагинов. Это делает его удобным инструментом для работы с API, которые возвращают даты в стандартизированном формате.
Разбор ISO-строки:
import dayjs from 'dayjs';
const date = dayjs('2026-01-22T10:30:00Z');
В данном случае строка автоматически интерпретируется как UTC-время, несмотря на отсутствие явной настройки.
Если строка содержит смещение:
const date = dayjs('2026-01-22T10:30:00+05:00');
Day.js корректно учитывает смещение и преобразует время во внутреннее представление.
Одной из наиболее используемых операций является генерация ISO-строки из объекта Day.js.
const now = dayjs();
const iso = now.toISOString();
Метод toISOString() возвращает строку строго в формате
UTC:
2026-01-22T08:15:30.000Z
Особенности:
Z)ISO 8601 допускает два ключевых представления:
Day.js при вызове toISOString() всегда приводит время к
UTC, что важно учитывать при работе с локальными датами.
const local = dayjs('2026-01-22T10:00:00');
const iso = local.toISOString();
Если требуется сохранить локальное смещение, ISO 8601 формат должен
формироваться иначе, с использованием плагина utc и
timezone.
Для более строгого контроля над временными зонами применяется плагин
utc.
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const date = dayjs.utc('2026-01-22T10:00:00Z');
Создание ISO-строки в UTC-режиме:
const iso = date.utc().format();
Результат:
2026-01-22T10:00:00Z
Функция format() в сочетании с utc()
позволяет фиксировать ISO-строку без локального смещения.
ISO 8601 включает несколько уровней детализации:
2026-01-22
2026-01-22T10:30:00
2026-01-22T10:30:00.123
2026-01-22T10:30:00Z
2026-01-22T10:30:00+03:00
Day.js корректно интерпретирует все перечисленные варианты, сохраняя внутреннюю нормализацию времени.
ISO 8601 является «родным» форматом для Day.js, поэтому базовый парсинг не требует дополнительных настроек:
const a = dayjs('2026-12-01T00:00:00Z');
const b = dayjs('2026-12-01T00:00:00+02:00');
Оба значения будут преобразованы в единую временную шкалу, что упрощает сравнение.
Сравнение дат:
a.isBefore(b);
a.isAfter(b);
a.isSame(b);
Несмотря на поддержку ISO 8601, существуют нюансы:
Пример:
dayjs('2026-01-22')
Такое значение считается полуночью в локальной зоне.
Day.js предоставляет гибкий метод format(), но ISO 8601
требует строго определённого синтаксиса.
dayjs().format()
Без параметров результат будет ISO-подобным:
2026-01-22T10:30:00+03:00
Однако это не всегда строго UTC ISO-формат, поэтому для стандартного представления используется:
dayjs().toISOString()
ISO 8601 допускает дробные секунды, и Day.js всегда включает
миллисекунды при toISOString().
dayjs('2026-01-22T10:30:00.123Z').toISOString();
Результат:
2026-01-22T10:30:00.123Z
Если миллисекунды равны нулю, они всё равно отображаются:
2026-01-22T10:30:00.000Z
ISO-строки удобны для сравнения, поскольку лексикографический порядок соответствует хронологическому при условии UTC.
const a = dayjs('2026-01-01T00:00:00Z');
const b = dayjs('2026-01-02T00:00:00Z');
a.isBefore(b);
Такая модель упрощает сортировку:
const sorted = [
'2026-01-03T00:00:00Z',
'2026-01-01T00:00:00Z',
'2026-01-02T00:00:00Z'
].map(dayjs).sort((x, y) => x - y);
ISO 8601 используется как универсальный формат передачи времени между клиентом и сервером.
Пример отправки:
const payload = {
createdAt: dayjs().toISOString()
};
Получение:
const received = dayjs(payload.createdAt);
Отсутствие локальных смещений снижает вероятность ошибок при синхронизации систем.
Некоторые API используют частичные ISO-форматы:
Day.js интерпретирует их следующим образом:
dayjs('2026-01-22') // начало дня
dayjs('2026-01-22T10:00') // локальное время
При необходимости строгой обработки применяется
customParseFormat, но для ISO-8601 это редко требуется.
Несмотря на наличие смещений в ISO, Day.js внутренне хранит время в UTC-эквиваленте.
dayjs('2026-01-22T10:00:00+03:00')
После парсинга значение приводится к единой временной шкале, что позволяет корректно сравнивать даты из разных зон.
При необходимости отображения локального времени используется плагин
timezone.
Типичная работа с ISO в приложениях включает три операции:
const created = dayjs().toISOString();
const restored = dayjs(created);
const same = restored.isSame(dayjs(created));
Такой цикл обеспечивает стабильность хранения временных значений.
Хотя ISO 8601 в основном описывает моменты времени, он также поддерживает интервалы:
2026-01-01T00:00:00Z/2026-01-10T00:00:00Z
Day.js не имеет встроенного полноценного парсинга интервалов ISO 8601, поэтому такие строки обычно разбиваются вручную:
const [start, end] = range.split('/');
const startDate = dayjs(start);
const endDate = dayjs(end);
Использование ISO 8601 в связке с Day.js формирует единый слой временной абстракции:
Day.js выступает как промежуточный слой между строковым ISO-представлением и операциями над временем, обеспечивая предсказуемую нормализацию значений.