Ревью: работа с датами
Вопрос
Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.
Читай вслух, как на ревью: сначала что делает код, потом что сломано.
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 зависит от формата и браузера
нет проверки на 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 ошибок.