Поиск максимальной даты в массиве значений сводится к корректному сравнению временных меток и выбору наибольшего значения. В контексте Day.js работа с датами строится поверх неизменяемых объектов, каждый из которых представляет момент времени с точностью до миллисекунд.
Любая дата в Day.js может быть приведена к числовому представлению через Unix timestamp (миллисекунды с 1970 года):
import dayjs from 'dayjs';
const d = dayjs('2026-01-01');
console.log(d.valueOf()); // число миллисекунд
Метод valueOf() является ключевым при поиске
максимальной даты, поскольку позволяет использовать стандартные числовые
алгоритмы JavaScript.
Если даты представлены строками или объектами Day.js, их можно
преобразовать в массив чисел и использовать Math.max:
import dayjs from 'dayjs';
const dates = [
dayjs('2024-05-01'),
dayjs('2025-08-10'),
dayjs('2023-12-31')
];
const maxTimestamp = Math.max(...dates.map(d => d.valueOf()));
const maxDate = dayjs(maxTimestamp);
console.log(maxDate.format('YYYY-MM-DD'));
Данный подход эффективен при небольших и средних массивах, так как использует встроенные оптимизации JavaScript-движка.
При необходимости более контролируемой логики сравнения применяется
reduce, позволяющий явно определить правило выбора
максимального значения:
import dayjs from 'dayjs';
const dates = [
dayjs('2024-05-01'),
dayjs('2025-08-10'),
dayjs('2023-12-31')
];
const maxDate = dates.reduce((max, current) => {
return current.valueOf() > max.valueOf() ? current : max;
});
console.log(maxDate.format('YYYY-MM-DD'));
Здесь сравнение выполняется напрямую по числовому представлению, что исключает необходимость дополнительных преобразований.
Day.js предоставляет семантические методы сравнения дат:
isAfterisBeforeisSameПример поиска максимальной даты:
import dayjs from 'dayjs';
const dates = [
dayjs('2024-05-01'),
dayjs('2025-08-10'),
dayjs('2023-12-31')
];
let maxDate = dates[0];
for (const date of dates) {
if (date.isAfter(maxDate)) {
maxDate = date;
}
}
console.log(maxDate.format('YYYY-MM-DD'));
Такой вариант улучшает читаемость и уменьшает зависимость от явного преобразования в числа.
При работе с внешними источниками данных необходимо учитывать возможность некорректных значений:
const safeDates = dates.filter(d => d.isValid());
После фильтрации можно применять любой из стандартных методов поиска максимума.
При отсутствии данных логика должна учитывать начальное состояние:
const maxDate = dates.length
? dates.reduce((max, current) =>
current.isAfter(max) ? current : max
)
: null;
Это предотвращает ошибки обращения к несуществующему элементу массива.
Day.js по умолчанию работает в локальной временной зоне среды выполнения. При необходимости унифицированного сравнения используется плагин UTC:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const dates = [
dayjs.utc('2025-01-01T10:00:00Z'),
dayjs.utc('2025-01-01T09:00:00Z')
];
const maxDate = dates.reduce((max, current) =>
current.valueOf() > max.valueOf() ? current : max
);
console.log(maxDate.toISOString());
Использование UTC устраняет влияние локального смещения времени при сравнении.
Day.js поддерживает расширение функциональности через плагины, включая MinMax:
import dayjs from 'dayjs';
import minMax from 'dayjs/plugin/minMax';
dayjs.extend(minMax);
const dates = [
dayjs('2024-05-01'),
dayjs('2025-08-10'),
dayjs('2023-12-31')
];
const maxDate = dayjs.max(dates);
console.log(maxDate.format('YYYY-MM-DD'));
Плагин minMax предоставляет готовые функции
dayjs.max() и dayjs.min(), упрощающие поиск
экстремальных значений без ручной реализации алгоритма.
Использование Math.max обеспечивает компактность, но
требует преобразования в числа.
reduce даёт гибкость и контроль над логикой
сравнения.
isAfter повышает читаемость кода и лучше отражает смысл
операции на уровне предметной области.
Плагин MinMax минимизирует объём кода и подходит для случаев, где требуется чистое декларативное выражение операции поиска максимума.