Day.js предоставляет компактный API для работы с датами, который тесно интегрируется с механизмами сериализации и десериализации JSON в JavaScript. В контексте обмена данными между клиентом и сервером корректная обработка временных значений становится критически важной, поскольку различные системы могут по-разному интерпретировать строки даты, временные зоны и форматы представления времени.
Экземпляр Day.js представляет собой обёртку над стандартным объектом
Date, но с неизменяемым (immutable) подходом к
преобразованиям. Каждая операция над датой возвращает новый экземпляр,
что делает поведение предсказуемым при последовательных
трансформациях.
При работе с API это важно, поскольку любые данные, полученные в формате JSON, после парсинга становятся обычными объектами, а не специализированными типами. Поэтому интеграция Day.js часто начинается с преобразования строковых дат в управляемые объекты библиотеки.
import dayjs from 'dayjs';
const timestamp = '2026-05-23T10:15:30Z';
const date = dayjs(timestamp);
Строка ISO 8601 автоматически распознаётся и преобразуется в корректный момент времени, если формат соответствует стандарту.
Большинство API возвращает даты в JSON в виде строк. Это может быть ISO-строка, UNIX timestamp или нестандартный формат. Day.js позволяет унифицировать обработку таких данных через единый слой преобразования.
fetch('/api/orders')
.then(res => res.json())
.then(data => {
return data.map(order => ({
...order,
createdAt: dayjs(order.createdAt),
updatedAt: dayjs(order.updatedAt)
}));
});
После такого преобразования работа с датами становится предсказуемой:
форматирование, сравнение и арифметика дат выполняются средствами
Day.js, а не вручную через Date.
При сериализации объектов JavaScript через
JSON.stringify используется метод toJSON, если
он определён. Объекты Day.js реализуют этот метод, возвращая ISO-строку
даты.
const date = dayjs('2026-05-23T10:15:30Z');
JSON.stringify({ date });
Результат:
{"date":"2026-05-23T10:15:30.000Z"}
Это поведение делает Day.js совместимым с REST API без дополнительных преобразований. Однако важно учитывать, что при обратной десериализации строка снова должна быть явно преобразована в объект Day.js.
В ряде случаев требуется контролировать формат, в котором дата уходит
в API. Day.js предоставляет метод format, позволяющий
формировать строки в любом необходимом представлении.
const payload = {
date: dayjs().format('YYYY-MM-DD'),
timestamp: dayjs().toISOString(),
unix: dayjs().unix()
};
fetch('/api/save', {
method: 'POST',
body: JSON.stringify(payload)
});
Разные форматы используются для разных задач:
API нередко возвращают даты в нестандартных форматах, например
DD.MM.YYYY или YYYY/MM/DD HH:mm:ss. Для
корректной интерпретации таких строк используется плагин
customParseFormat.
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);
const date = dayjs('23.05.2026', 'DD.MM.YYYY');
Без явного указания формата парсинг может дать некорректный результат или привести к invalid date.
В реальных API данные часто имеют вложенную структуру, где даты могут находиться на разных уровнях объекта. Для корректной обработки применяется рекурсивное преобразование.
function parseDates(obj) {
if (Array.isArray(obj)) {
return obj.map(parseDates);
}
if (obj !== null && typeof obj === 'object') {
const result = {};
for (const key in obj) {
if (typeof obj[key] === 'string' && key.toLowerCase().includes('date')) {
result[key] = dayjs(obj[key]);
} else {
result[key] = parseDates(obj[key]);
}
}
return result;
}
return obj;
}
Такой подход позволяет централизованно приводить JSON к рабочим структурам без ручного преобразования каждого поля.
JSON сам по себе не содержит информации о временной зоне, если она не
закодирована в строке. Day.js с плагином utc позволяет явно
управлять интерпретацией времени.
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const date = dayjs.utc('2026-05-23T10:15:30Z');
При сериализации важно учитывать, что перевод в локальное время или UTC может изменить смысл данных при обмене между системами.
Некоторые API используют числовые временные метки. Day.js напрямую поддерживает их обработку.
const date = dayjs.unix(1716456930);
const payload = {
timestamp: dayjs().unix()
};
Такой формат удобен для хранения и передачи, но требует явной интерпретации на стороне клиента.
При глубокой интеграции с API можно управлять сериализацией через
replacer и reviver, обеспечивая автоматическое
преобразование дат.
function replacer(key, value) {
if (dayjs.isDayjs(value)) {
return value.toISOString();
}
return value;
}
const json = JSON.stringify(data, replacer);
Обратное преобразование:
function reviver(key, value) {
if (typeof value === 'string' && /\d{4}-\d{2}-\d{2}T/.test(value)) {
return dayjs(value);
}
return value;
}
const parsed = JSON.parse(json, reviver);
Такой механизм позволяет встроить Day.js в процесс сериализации без ручной обработки каждого поля.
После преобразования JSON-данных в Day.js-объекты становится доступен полный набор методов сравнения.
const a = dayjs('2026-05-01');
const b = dayjs('2026-05-23');
const isBefore = a.isBefore(b);
const isAfter = a.isAfter(b);
const isSame = a.isSame(b, 'day');
При работе с API это часто используется для фильтрации и сортировки данных после получения ответа сервера.
Перед отправкой данных важно приводить даты к единому формату, иначе сервер может интерпретировать их неоднозначно.
function normalizePayload(payload) {
return {
...payload,
createdAt: dayjs(payload.createdAt).toISOString(),
updatedAt: dayjs(payload.updatedAt).toISOString()
};
}
Использование ISO 8601 минимизирует риск расхождений между часовыми поясами и системами хранения.
JSON выступает лишь транспортным форматом, не имеющим собственной семантики времени. Day.js выполняет роль промежуточного слоя, который восстанавливает смысл временных значений после десериализации и стандартизирует их перед сериализацией.
Такая архитектура позволяет разделить ответственность: