Поиск минимальной даты

Поиск минимальной даты в наборах данных на Day.js сводится к корректному сравнению объектов времени и выбору наиболее раннего значения из коллекции. Библиотека Day.js предоставляет минималистичный API, но при этом сохраняет совместимость с привычной логикой работы с датами через сравнение, преобразование и арифметику времени.

Любая операция поиска минимальной даты начинается с нормализации входных значений. Day.js позволяет работать со строками, объектами Date и уже созданными экземплярами Day.js.

Ключевая задача на этом этапе — привести все элементы массива к единому формату:

import dayjs from "dayjs";

const dates = [
  "2024-06-10",
  "2023-01-05",
  "2025-02-20",
  "2023-01-01"
];

const normalized = dates.map(d => dayjs(d));

После преобразования каждый элемент становится полноценным объектом Day.js, поддерживающим сравнение и арифметику.

Сравнение дат через isBefore

Основной способ определения минимальной даты — использование метода isBefore. Он позволяет явно задать правило сравнения двух временных значений.

const a = dayjs("2023-01-01");
const b = dayjs("2024-01-01");

const result = a.isBefore(b); // true

При поиске минимального значения логика строится вокруг последовательного сравнения элементов массива.

Поиск минимальной даты через reduce

Наиболее универсальный способ — использование reduce, где каждый следующий элемент сравнивается с текущим минимумом.

const minDate = normalized.reduce((min, current) => {
  return current.isBefore(min) ? current : min;
});

console.log(minDate.format("YYYY-MM-DD"));

Алгоритм работает линейно, проходя по всем элементам массива и сохраняя наиболее раннюю дату.

Внутренняя логика:

  • начальное значение — первый элемент массива
  • каждое следующее значение сравнивается с текущим минимумом
  • при необходимости минимум обновляется

Альтернативный подход через числовое представление

Day.js позволяет получать Unix-время через метод valueOf, что упрощает сравнение:

const minDate = normalized.reduce((min, current) => {
  return current.valueOf() < min.valueOf() ? current : min;
});

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

Работа с массивами строковых дат

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

const rawDates = [
  "2023/01/05",
  "2022/12/31",
  "2024/02/10"
];

const parsed = rawDates.map(d => dayjs(d, "YYYY/MM/DD"));

const minDate = parsed.reduce((min, current) =>
  current.isBefore(min) ? current : min
);

Если формат указан неверно, Day.js может вернуть некорректную дату, что приведёт к ошибкам сравнения.

Обработка пустых массивов и некорректных значений

При работе с минимальной датой важно учитывать пограничные случаи:

  • пустой массив
  • некорректные даты
  • Invalid Date

Пример безопасной обработки:

const validDates = normalized.filter(d => d.isValid());

if (validDates.length === 0) {
  throw new Error("Нет корректных дат для обработки");
}

const minDate = validDates.reduce((min, current) =>
  current.isBefore(min) ? current : min
);

Метод isValid позволяет исключить некорректные значения до начала сравнения.

Учет временных зон

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

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

const dates = [
  dayjs.utc("2023-01-01T10:00:00Z"),
  dayjs.utc("2023-01-01T08:00:00Z"),
  dayjs.utc("2023-01-01T09:00:00Z")
];

const minDate = dates.reduce((min, current) =>
  current.isBefore(min) ? current : min
);

Использование UTC устраняет влияние локального времени на результат сравнения.

Сравнение через diff как вспомогательный механизм

Хотя isBefore является основным инструментом, метод diff может использоваться для явного числового сравнения:

const minDate = normalized.reduce((min, current) => {
  return current.diff(min) < 0 ? current : min;
});

diff возвращает разницу во времени, где отрицательное значение означает более раннюю дату.

Работа с большими массивами

При обработке больших наборов данных минимизация количества вызовов методов Day.js повышает производительность. Оптимальный вариант — предварительное преобразование в числовые значения:

const timestamps = dates.map(d => dayjs(d).valueOf());

const minTimestamp = Math.min(...timestamps);

const minDate = dayjs(minTimestamp);

Этот подход уменьшает количество объектов Day.js в процессе вычисления.

Типичные ошибки при поиске минимальной даты

  • сравнение строк вместо объектов Day.js
  • смешивание форматов дат в одном массиве
  • игнорирование Invalid Date
  • отсутствие нормализации временных зон
  • использование min без начального значения в reduce на пустом массиве

Каждая из этих ошибок приводит к некорректному результату, особенно в больших и неоднородных наборах данных.