Проблема с часовыми поясами
У меня описана следующая entity:
weekDay- номер дня недели (где 0 - понедельник)minuteStart- минута дня, с которой начинается рабочее времяminuteEnd- минута дня, в которую заканчивается рабочее времяstep- шаг в минутах, с которым будут формироваться свободные ячейки
Через веб-интерфейс админ задает день, старт и конец рабочего дня, а также шаг, с которым будут формироваться ячейки времени для возможности занятия их простыми пользователями. Далее пользователи обращаются по REST API с указанием интересующего их дня и получают ответ в виде списка ячеек времени. Например, админ занес информацию на понедельник (weekDay - 0) о том, что рабочий день начинается в 10:00 (minuteStart - 600), заканчивается в 19:00 (minuteEnd - 1140), указал шаг в 30 минут (step - 30), ответ для пользователя будет следующим:
- 10:00
- 10:30
- 11:00
- 11:30
- ...
- 18:30
Пользователь имеет возможность выбрать одну из этих ячеек и забронировать ее, после этого она будет недоступна для брони. И эта схема отлично работала в одном часовом поясе (МСК). Теперь же появилась необходимость добавить поддержку нескольких часовых поясов, т.к. пользователи могут быть из других временных зон.
Как можно адаптировать эту модель под изменения и бронирование из любых часовых поясов? Понимаю, что модель для этого может быть не самая удачная, но совсем не представляю как ее можно переделать, учитывая, что как админ может быть с одним часовым поясом, так и пользователь может быть с абсолютно другим. Ранее не имел опыта работы с временными зонами, так что особо не представляют как это сделать.
Ответы (1 шт):
Пришлось адаптировать всю систему под часовые пояса. В первую очередь поменял логику Entity расписаний - убрал weekDay, а минуты теперь считаются с начала недели, а не дня.
Теперь при запросе пользователю необходимо передать дату в ISO 8601 формате с указанием часового пояса, после чего формируется список свободных ячеек на выбранный день и возвращается в виде тех же ISO дат:
- 2021-06-30T10:00:00+03:00
- 2021-06-30T10:30:00+03:00
- 2021-06-30T11:00:00+03:00
- ...
- 2021-06-30T18:30:00+03:00
При другом часовом поясе будет сдвиг по времени. Пользователь выбирает одну из дат и передает в неизменном виде. ISO даты хорошо воспринимаются другими ЯП, так что проблем с конвертацией особо не возникает. В целом, проблема решена.