checklistsdates

Чек-лист тестирования полей с датой и временем

Поле «выберите дату» выглядит безобидно — но именно с датами и временем в продакшене проваливается больше всего проверок. Часовые пояса, переходы на летнее, локали, високосные года — каждый пункт уже стрелял в кого-то.

Базовые кейсы

  • Минимальная и максимальная допустимая дата (граничные значения, в т.ч. на день/секунду больше).
  • Дата в прошлом и в будущем — валидируется ли согласно ТЗ.
  • Текущий момент с точностью до миллисекунд (важно для transaction-логов).

Часовые пояса

🌍 Юзер в UTC+3 создаёт событие на 23:30. Сервер хранит в UTC. При просмотре из UTC-8 — какая дата отобразится? Проверьте, что нет «сдвига дня».

🌍 IANA timezones vs offsets: Europe/Moscow и +03:00 — это разные сущности, первое учитывает исторические изменения зоны.

🌍 Серверное время может быть рассинхронизировано с клиентским — NTP в проде иногда выключают.

DST (переходы на летнее)

⚠️ В ночь перевода в Европе пропадает час 02:00–03:00 — событие на 02:30 невалидно.

⚠️ При обратном переводе час 02:00–03:00 повторяется — крон 0 2 * * * сработает дважды.

⚠️ Россия с 2011 года часы не переводит, но в библиотеках это работает только с актуальной tzdata.

Форматы и локали

  • DD/MM/YYYY (Европа) vs MM/DD/YYYY (US) vs YYYY-MM-DD (ISO 8601). Поле «01/02/2024» — это 1 февраля или 2 января?
  • Локализация: «May» vs «Май» vs «5月» — парсер поддерживает все варианты?
  • Двузначный год: 25 → 2025 или 1925? Java SimpleDateFormat по умолчанию интерпретирует значения >50 как 19xx.

Граничные баги

🐞 Високосные года: 29 февраля 2024 (есть) и 2025 (нет) — оба обработаны?

🐞 31 января + 1 месяц = 28/29 февраля? В JS new Date(2024,0,31).setMonth(2) отдаёт 2 марта.

🐞 Y2K38: Unix timestamp 2038-01-19 03:14:07 переполняет int32. Если бекенд использует 32-bit time_t — упадёт.

Что делать прямо сейчас

✅ В тест-кейсах фиксируйте часовой пояс явно — «23:30 UTC» или «23:30 Europe/Moscow», не просто «23:30».

✅ Заведите параметризованный набор тестов с DST-датами для своих рынков.

✅ Проверяйте отображение даты в UI из разных часовых поясов (мокая системное время).

✅ Для API-контрактов используйте только ISO 8601 с явным offset.

Подробнее: Computerphile — The Problem with Time and Timezones.