Какой числовой формат даты подходит для сравнения объектов Date в JavaScript
Что проверяют
Знаете ли вы, что внутри Date хранится одно число, и понимаете ли, где сравнение объектов работает, а где тихо врёт. Следом почти всегда спрашивают, почему date1 === date2 даёт false для одинаковых дат.
Как отвечать
Нужный формат это timestamp: количество миллисекунд от 1 января 1970 года по UTC. Получить его можно несколькими способами, результат одинаковый:
getTime(): самый читаемый вариант, его и стоит назвать первым;valueOf(): возвращает то же число, именно его неявно вызывают операторы сравнения;- унарный плюс и
Number(date): короче, но хуже читается на ревью; Date.now(): текущий момент сразу числом, без создания объекта.
Операторы <, >, <=, >= с объектами Date работают и без явного преобразования: объект приводится к числу. Вычитание тоже даёт число, поэтому сортировка пишется как dates.sort((a, b) => a - b). А вот == и === сравнивают ссылки, так что для равенства нужно a.getTime() === b.getTime().
Сильный ответ касается ещё двух тем. Невалидная дата: new Date('abc').getTime() возвращает NaN, а любое сравнение с NaN ложно, поэтому проверяйте Number.isNaN(d.getTime()). Часовые пояса: timestamp от них не зависит, но разбор строки зависит. '2026-09-11' читается как полночь UTC, а '2026-09-11T00:00' без смещения как полночь по местному времени.
Где спотыкаются
Сравнивают даты через === и удивляются false. Это два разных объекта, и одинаковое время внутри на равенство ссылок не влияет.
Сравнивают строки из toLocaleDateString(). Формат зависит от локали, и строка «02.10.2026» окажется меньше «11.09.2026», хотя октябрь позже сентября.
Складывают дату с числом через +, ожидая сдвиг времени. Для Date бинарный плюс выбирает строковое преобразование, и вместо числа получается склейка строк. Сдвигайте через getTime() + ms или setDate().