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

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

Любая дата в Day.js может быть приведена к числовому представлению через Unix timestamp (миллисекунды с 1970 года):

import dayjs from 'dayjs';

const d = dayjs('2026-01-01');
console.log(d.valueOf()); // число миллисекунд

Метод valueOf() является ключевым при поиске максимальной даты, поскольку позволяет использовать стандартные числовые алгоритмы JavaScript.


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

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

При необходимости более контролируемой логики сравнения применяется 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'));

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


Сравнение через isAfter

Day.js предоставляет семантические методы сравнения дат:

  • isAfter
  • isBefore
  • isSame

Пример поиска максимальной даты:

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 устраняет влияние локального смещения времени при сравнении.


Использование плагина MinMax

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 минимизирует объём кода и подходит для случаев, где требуется чистое декларативное выражение операции поиска максимума.