Как синхронизировать таймзону между фронтендом и бэкендом?

Часовые пояса часто заставляют задуматься как с ними правильно работать.
В большинстве случаев при проектировании API принято использовать или unixtime или датувремя с указанием часового пояса, но мой вопрос не про это.

Мой вопрос относится к API для фронтенда (т.е. речь идет не про RESTful API для server-to-server взаимодействия, а про API для фронтендов к которому одно из приоритетных требований - это минимизация количества запросов).

Например, есть метод который должен выдать список задач на сегодня. Понятие "сегодня" зависит от текущей таймзоны. Как бэкенду определить текущую таймзону фронтенда? Мои варианты:

1. Посмотреть в профиле пользователя, какая там указана таймзона. С профилем есть две проблемы: во-первых, пользователи очень редко выбирают свою таймзону, во-вторых, даже если пользователь указал правильную таймзону в профиле (или, например, её удалось как-то автоматически определить при регистрации), пользователь может поехать (или вообще переехать) в другой часовой пояс.

2. В метод списка задач на сегодня нужно явно передать таймзону, что-то вроде: GET /tasks/today?offset=+03:00
ИМХО выглядит как какой-то костыль.

3. Добавить ко всем запросам в API заголовок что-то вроде Current-User-Offset: +03:00
Если заголовок не передан, ориентироваться на значение по умолчанию (например, на таймзону из профиля).

4. API спроектирован неправильно, таких проблем быть вообще не должно. Например, нужен метод с получением списка задач, а какие из задач отнести к "сегодняшним" решает фронтенд.
  • Вопрос задан
  • 338 просмотров
Пригласить эксперта
Ответы на вопрос 2
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Например, есть метод который должен выдать список задач на сегодня. Понятие "сегодня" зависит от текущей таймзоны. Как бэкенду определить текущую таймзону фронтенда?

В запросе указывать дату и время в стандартном формате - либо UTC либо местное время и таймзона: т.е., клиент запрашивает данные не за абстрактное "сегодня", а в четко определенном интервале времени. Например, за день такой-то с такого-то времени в течении суток или до дня такого-то.
Ответ написан
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Я видел решение, где с помощью js на фронте определялся timeoffset и записывался в cookies. Соответственно на беке - считывался и применялся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы