Часовые пояса часто заставляют задуматься как с ними правильно работать. В большинстве случаев при проектировании API принято использовать или unixtime или датувремя с указанием часового пояса, но мой вопрос не про это.
Мой вопрос относится к API для фронтенда (т.е. речь идет не про RESTful API для server-to-server взаимодействия, а про API для фронтендов к которому одно из приоритетных требований - это минимизация количества запросов).
Например, есть метод который должен выдать список задач на сегодня. Понятие «сегодня» зависит от текущей таймзоны. Как бэкенду определить текущую таймзону фронтенда? Мои варианты:
-
Посмотреть в профиле пользователя, какая там указана таймзона. С профилем есть две проблемы: во-первых, пользователи очень редко выбирают свою таймзону, во-вторых, даже если пользователь указал правильную таймзону в профиле (или, например, её удалось как-то автоматически определить при регистрации), пользователь может поехать (или вообще переехать) в другой часовой пояс.
-
В метод списка задач на сегодня нужно явно передать таймзону, что-то вроде: GET /tasks/today?offset=+03:00 ИМХО выглядит как какой-то костыль.
-
Добавить ко всем запросам в API заголовок что-то вроде Current-User-Offset: +03:00 Если заголовок не передан, ориентироваться на значение по умолчанию (например, на таймзону из профиля).
-
API спроектирован неправильно, таких проблем быть вообще не должно. Например, нужен метод с получением списка задач, а какие из задач отнести к «сегодняшним» решает фронтенд.