Как хранить даты и время, чтобы корректно показывать их в часовом поясе пользователя?

Момент времени, будущий локальный график и календарная дата требуют разных моделей. Почему идентификатор IANA нельзя заменить текущим смещением.

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

Что ответить на собеседовании

Для произошедшего события храните однозначный момент времени, обычно в UTC, а зону пользователя используйте при отображении. Для будущего локального расписания сохраняйте локальные дату и время, IANA-зону и правило повторения, если оно есть. Дату рождения храните как дату без времени. Фиксированное смещение не заменяет часовой пояс; переходы времени могут создавать неоднозначные или несуществующие локальные значения.

Подробный разбор

Ответ с пояснениями

Сначала нужно определить смысл данных. Правило «всё хранить в UTC» подходит не каждой бизнес-сущности.

Момент события. Для регистрации запроса или оплаты храните однозначный instant, обычно представленный в UTC. При показе преобразуйте его в выбранную пользователем IANA-зону, например Europe/Berlin. Если важно восстановить исходное местное представление события, отдельно сохраните соответствующую зону или смещение на тот момент.

Будущее локальное расписание. Для встречи «в девять утра по местному времени» или повторяющегося занятия сохраняйте локальную дату и время, идентификатор зоны и правила повторения. Рассчитанный UTC-момент может потребовать пересчёта, если изменятся правила зоны. Если бизнес намеренно фиксирует абсолютный момент независимо от местных часов, это другое требование. Различия описаны в материале W3C.

Дата без времени. День рождения или календарную дату документа храните как дату, не добавляя искусственную полночь UTC: при преобразовании она может превратиться в предыдущий или следующий день.

Идентификатор IANA — не синоним смещения +03:00. Зона содержит правила, которые зависят от даты и могут меняться; IANA обновляет базу с учётом таких изменений.

При переводе локального времени в instant учитывайте переходы часов: некоторые значения встречаются дважды или не существуют; пример обработки приведён в документации Java. Нужна явная политика: попросить уточнение, отклонить ввод либо выбрать оговорённый вариант. Не полагайтесь молча на выбор библиотеки.

Наконец, проверьте семантику типа БД, преобразования драйвера и формат API. Название поля само по себе не гарантирует сохранение исходной зоны.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку