Проблема с часовыми поясами

У меня описана следующая 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 шт):

Автор решения: WGPavell

Пришлось адаптировать всю систему под часовые пояса. В первую очередь поменял логику 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 даты хорошо воспринимаются другими ЯП, так что проблем с конвертацией особо не возникает. В целом, проблема решена.

→ Ссылка