Работа с API и JSON

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 и преобразование дат

Большинство 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.

Поддержка JSON и поведение toJSON

При сериализации объектов 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)
});

Разные форматы используются для разных задач:

  • ISO-строка — универсальный стандарт обмена
  • UNIX timestamp — компактное числовое представление
  • кастомный формат — для бизнес-логики или legacy-систем

Парсинг нестандартных JSON-форматов

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.

Обработка JSON с вложенными структурами

В реальных 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

JSON сам по себе не содержит информации о временной зоне, если она не закодирована в строке. Day.js с плагином utc позволяет явно управлять интерпретацией времени.

import utc from 'dayjs/plugin/utc';

dayjs.extend(utc);

const date = dayjs.utc('2026-05-23T10:15:30Z');

При сериализации важно учитывать, что перевод в локальное время или UTC может изменить смысл данных при обмене между системами.

Конвертация UNIX timestamp при работе с API

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

const date = dayjs.unix(1716456930);

const payload = {
  timestamp: dayjs().unix()
};

Такой формат удобен для хранения и передачи, но требует явной интерпретации на стороне клиента.

Модификация JSON.stringify через reviver и replacer

При глубокой интеграции с 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 в процесс сериализации без ручной обработки каждого поля.

Сравнение дат в данных API

После преобразования 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 как слой транспортировки временных данных

JSON выступает лишь транспортным форматом, не имеющим собственной семантики времени. Day.js выполняет роль промежуточного слоя, который восстанавливает смысл временных значений после десериализации и стандартизирует их перед сериализацией.

Такая архитектура позволяет разделить ответственность:

  • API передаёт строки или числа
  • JSON обеспечивает транспорт
  • Day.js управляет логикой времени внутри приложения