Ответ вслух Middle Код-ревью обновлено

Ревью: работа с датами

Вопрос

Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.

Читай вслух, как на ревью: сначала что делает код, потом что сломано.

function isExpired(subscription) {
  const end = new Date(subscription.endDate);
  return end < new Date();
}

function formatDate(iso) {
  const d = new Date(iso);
  return d.getDate() + '.' + (d.getMonth() + 1) + '.' + d.getFullYear();
}

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Разбор. new Date(строка) надёжно понимает только ISO 8601; на формате 01.02.2026 браузеры расходятся, а часть вернёт Invalid Date - и никакой ошибки не будет, сравнение просто даст false. Проверка на isNaN(d) обязательна.

Что должно прозвучать в ответе

  • разбор произвольной строки new Date зависит от формата и браузера

  • нет проверки на Invalid Date

  • сравнение в локальном времени клиента - часовые пояса дают сдвиг на сутки

  • форматирование без ведущих нулей: получится 1.1.2026

  • вместо ручной сборки строки - Intl.DateTimeFormat

  • срок подписки должен проверяться на сервере, а не на клиенте

Что могут спросить следом

  • Как правильно хранить дату окончания подписки?
  • Почему Intl.DateTimeFormat стоит создавать один раз?

Разбор

Разбор. new Date(строка) надёжно понимает только ISO 8601; на формате 01.02.2026 браузеры расходятся, а часть вернёт Invalid Date - и никакой ошибки не будет, сравнение просто даст false. Проверка на isNaN(d) обязательна.

Часовые пояса. Дата без времени разбирается как UTC, а getDate() возвращает локальное число - для пользователя во Владивостоке подписка «закончится» на сутки раньше или позже. Это самый частый баг с датами в российских продуктах.

Форматирование. Ручная сборка даёт 1.1.2026 вместо 01.01.2026 и не учитывает локаль. Intl.DateTimeFormat('ru-RU') делает это правильно, причём созданный один раз форматтер заметно быстрее.

И главное архитектурно: истечение подписки нельзя проверять на клиенте - часы пользователя произвольны. Клиент может это показывать, решать должен сервер.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.