Поиск минимальной даты в наборах данных на 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. Он позволяет явно задать правило сравнения двух
временных значений.
const a = dayjs("2023-01-01");
const b = dayjs("2024-01-01");
const result = a.isBefore(b); // true
При поиске минимального значения логика строится вокруг последовательного сравнения элементов массива.
Наиболее универсальный способ — использование 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 устраняет влияние локального времени на результат сравнения.
Хотя 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 в процессе вычисления.
Invalid Datemin без начального значения в
reduce на пустом массивеКаждая из этих ошибок приводит к некорректному результату, особенно в больших и неоднородных наборах данных.