> Какой числовой формат даты подходит для сравнения объектов Date в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: ITFB

Стек: JavaScript

> Пример ответа

Короткий ответ

Для сравнения объектов Date в JavaScript используйте числовой формат timestamp - количество миллисекунд, прошедших с 1 января 1970 года UTC. Получить его можно через date.getTime(), Date.parse() или унарный плюс +date. Этот формат гарантирует корректное сравнение с учётом часовых поясов и временных зон, в отличие от строковых представлений.

Подробное объяснение

Объекты Date в JavaScript хранят время как количество миллисекунд с эпохи Unix (1 января 1970, 00:00:00 UTC). При сравнении через операторы <, >, <=, >= JavaScript неявно преобразует объекты Date в числа через valueOf(), который возвращает timestamp. Однако оператор == и строгое === сравнивают ссылки на объекты, а не их значения, поэтому для равенства нужно явно сравнивать getTime().

Строковые форматы (ISO 8601, RFC 2822) зависят от часового пояса и могут давать неверные результаты при сравнении дат из разных зон. Timestamp же всегда в UTC, что делает сравнение детерминированным.

На практике

  • Используйте date1.getTime() === date2.getTime() для проверки равенства
  • Для сравнения "больше/меньше" можно напрямую: date1 > date2 (работает из-за неявного приведения)
  • При работе с API предпочитайте передавать timestamp (число) или ISO-строку с явным указанием часового пояса
  • Для сортировки массива дат: dates.sort((a, b) => a - b) или dates.sort((a, b) => a.getTime() - b.getTime())

Пример кода

JAVASCRIPT
const date1 = new Date('2024-01-15T10:00:00Z');
const date2 = new Date('2024-01-15T13:00:00+03:00');
// Неправильно: сравниваются ссылки
console.log(date1 === date2); // false (всегда, даже если время одинаковое)
// Правильно: сравнение по timestamp
console.log(date1.getTime() === date2.getTime()); // true
// Сравнение "больше/меньше" через неявное приведение
console.log(date1 > date2); // false (равны)
// Сортировка массива
const dates = [
new Date('2024-03-01'),
new Date('2024-01-15'),
new Date('2024-07-20')
];
dates.sort((a, b) => a - b);
// или явно: dates.sort((a, b) => a.getTime() - b.getTime());

Как отвечать на собеседовании

Начните с прямого ответа: timestamp. Объясните, почему строковые форматы ненадёжны из-за часовых поясов. Упомяните разницу между == и getTime() для равенства. Покажите понимание неявного приведения типов при сравнении. Если спросят про производительность - скажите, что getTime() быстрее унарного плюса, но разница незначительна.

Что проверяет интервьюер

  • Понимание внутреннего представления Date (миллисекунды с эпохи)
  • Знание разницы между сравнением объектов и примитивов
  • Осведомлённость о проблемах часовых поясов
  • Умение выбирать правильный формат для конкретной задачи
  • Понимание неявного приведения типов в JavaScript

Типичные ошибки

  • Сравнение через date1 == date2 - всегда false для разных объектов
  • Использование строкового сравнения ISO-дат без учёта часового пояса
  • Сравнение через Date.parse() с нестандартными форматами (зависит от реализации)
  • Забывают, что new Date('2024-01-01') создаёт дату в UTC, а new Date(2024, 0, 1) - в локальном часовом поясе

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

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