LINUX.ORG.RU

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

 ,


0

3

Часовые пояса часто заставляют задуматься как с ними правильно работать. В большинстве случаев при проектировании 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 спроектирован неправильно, таких проблем быть вообще не должно. Например, нужен метод с получением списка задач, а какие из задач отнести к «сегодняшним» решает фронтенд.

★★

Голосую за вариант 1. Обоснование: поскольку любой «автоматизированный» способ может - а значит БУДЕТ - глючить, ответственность за просранные события должен нести только сам юзер.

Понятие «сегодня» зависит от текущей таймзоны.

Отдельно хочется добавить, что если у тебя выводимый «список дел на сегодня» режется по меткам 00:00 - 23:59, то подумай еще несколько раз.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 2)
Ответ на: комментарий от asdpm

То есть, какой твой довод?

Начну издалека: 2022-11-06T01:30:00US/Eastern - это когда? A если это не US/Eastern а фиксированное смещение - оно не несёт никакой дополнительной информации по сравнению с time_t и всего лишь waste of CPU cycles, ни больше, ни меньше.

bugfixer ★★★★
()
Ответ на: комментарий от bugfixer

Начну издалека: 2022-11-06T01:30:00US/Eastern - это когда?

Это когда? Это когда ты настолько тупой и поверхностный, что не отличаешь offset (смещение, difference between local time and UTC of day) от timezone abbreviation.

если это не US/Eastern а фиксированное смещение - оно не несёт никакой дополн

Какое еще US/Eastern? Откуда ты это взял? Глупенький, iso8601 допускает только offset, но не timezone abbreviation.

Передергивайте на свой 8601 дальше

То есть ты не понимаешь даже о чем споришь, не имеешь представления. А гонору-то. Самоуверен и совершенно профнепригоден. Вы на пару со словозапом феерично садитесь в лужу на таких простейших вещах.

asdpm
()
Ответ на: комментарий от no-such-file

сервер через пуш типа должен пнуть клиента

История на эту тему была на хабре, как человека уволили, за то, что он не смог сделать принятие уведомления с сервера (телефон переходил в экономичный режим и уведомления не принимал).

Shushundr ★★★
()
Ответ на: комментарий от bugfixer

Тебя спросили, с чем конкретно ты споришь, каков твой довод? Ты вместо этого «начал издалека»: продемонстрировал свою некомпетентность и закономерно опять сел в лужу.

И все же: каково твое утверждение, что ты заявляешь, что критикуешь?

asdpm
()

Очень легко - никак. Не надо тащить таймзону на бэк. Часовой пояс это по сути локация юзера, это фронт. В онлайн-запросе «сегодня» фронт просто передаёт бэку таймстампы «от и до» что в данный момент времени он подразумевает под «сегодня».

Единственный известный мне случай когда таймзона реально нужна на бэке (именно хранить её) - нотификации об оффлайн тасках по почте. Мы в этом случае берём таймзону из которой таск был запущен и открыто пишем её текстом в нотификации (типа Europe/London). Но разумеется возможны другие варианты

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 3)
Ответ на: комментарий от thesis

Зря подписываешься, кстати.

Подписался я именно под той частью фразы которую я цитировал: epoch привязано к моменту описанному в UTC, но это просто число. Или Вы о таких явлениях как leap seconds которые как бы «теряются»?

bugfixer ★★★★
()
Ответ на: комментарий от bugfixer

Подписался под «unix timestamp не UTC, к нему понятие тайм зоны не применимо», что, по-моему, противоречит нынешнему «epoch привязано к моменту описанному в UTC». Может, я не улавливаю ваших со словозапом идей, конечно.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от thesis

Может, я не улавливаю ваших со словозапом идей, конечно.

Абсолютно тот же самый стартовый момент для отсчёта мог быть определён как 1:00 CET, или 3:00 MSK. Является ли это эквивалентным определением epoch time? Конечно да. Делает ли оно epoch time привязанным к CET или MSK? Конечно нет.

bugfixer ★★★★
()
Ответ на: комментарий от SaBo

Нет, без таймзоны. Например, нужно уйти на пробежку в 19:00 по локальному времени.

Как уже написали, есть два вида задач. Уйти на пробежку в 19:00 по локальному времени (редко встречается), и посмотреть футбол/сходить к врачу/оплатить счет к 19:00 MSK. Из-за чего в треде полная неразбериха) И да, таймзону юзера определять по браузеру с возможностью сменить прямо на странице.

goingUp ★★★★★
()
Ответ на: комментарий от asdpm

И снова не удержался…

решил просто топить за свои тупые 4 байта unixtime

Вообще говоря в 64 битах time_t - 8 байт, но это такое… Профпригодный Вы наш. «Учите матчасть», как говорится, (c) не мой.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от asdpm

Глупенький, iso8601 допускает только offset, но не timezone abbreviation

Таймштампы будущего нельзя хранить только с offset’ом. Таймзоны временами меняются (штат решает что больше не будет переводить на летнее время, например) и после этого удачи найти в базе таймштампы событий, относящиеся именно к этому штату, и сдвинуть их на час.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Твое утверждение:

Таймзоны временами меняются

Правда? Спасибо. Продолжай наблюдение.

Таймштампы будущего нельзя хранить только с offset’ом

Согласно твоему утверждению, «нельзя хранить» следующие два time instant:

  • 2025-12-31T20:00:00+03:00
  • 1767200400

То есть нельзя:

  • сохранить для запланированного созвона с коллегой на дальнем востоке
  • записать в ssl сертификат как not before, not after
  • произвести отключение доступа к платной услуге в этот момент, т.к. она была куплена на ограниченное время
  • записать как момент с которого самолет может использовать оговоренное пространство
  • записать как time instant ожидаемого прибытия судна, которое уже вышло

Это всё нельзя потому что x3al сказал «нельзя хранить только с offset» для будущего. А вот если добавить MSK (зачем??) в вышеназванный список, то станет можно (x3al сказал)

asdpm
()
Ответ на: комментарий от thesis

Если он не привязан к UTC, почему в своем примере с CET и MSK ты взял смещение относительно UTC?)

Это просто arbitrary chosen starting point. Как то же её нужно описать? Вот принято описывать в UTC, но можно описать и по другому. И ничего от этого не изменится. Вы в принципе не можете привязаться к абсолютному времени не используя одну из общеизвестных TZ.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от asdpm

Ты многократно уже опозорился своей безграмотностью, некомпетентностью

Продолжайте нас развлекать. Не останавливайтесь, образованный Вы наш.

bugfixer ★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от asdpm

Эмм. Этот тред про календари и календари в итоге резолвятся на wall clock.

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

Если она продаётся на календарный год? Нельзя поскольку 0:00 может сместиться, например, на час если вдруг летнее время отменят и кастомер может спросить «а с чего это меня отключили в 23:00?». Это edge case, но он существует.

сохранить для запланированного созвона с коллегой на дальнем востоке

События не в одной таймзоне — совсем другое дело.

записать как time instant ожидаемого прибытия судна, которое уже вышло

Для достаточно близких дат ок. Для достаточно отдалённых событий — время отплытия может сместиться

И вообще, RTFM. Начать можно с http://www.creativedeletion.com/2015/03/19/persisting_future_datetimes.html

x3al ★★★★★
()
Ответ на: комментарий от x3al

Я:

записать как time instant ожидаемого прибытия судна, которое уже вышло

Ты:

Для достаточно близких дат ок. Для достаточно отдалённых событий — время отплытия может сместиться

У тебя какие-то виляния, тухлые попытки непонятно чего.

Судно вышло. Ожидаемое время прибытия «тра-та-та+03:00».

Ты говоришь:

нельзя хранить только с offset’ом".
... добавить отдельное поле под таймзону (не оффсет) — можно [ну то есть надо добавть MSK (бред)]

Согласно тебе, получается, что «тра-та-та+03:00» нельзя, нужно «тра-та-та+MSK». И если в пути meaning MSK политически меняется, то это проблема капитана (пусть ускорится или затормозится). И вообще всем будет так удобней. Ну что я могу сказать: ты путаешься в показаниях, юлишь. Чувствуешь что сел в лужу?

asdpm
()
Ответ на: комментарий от beastie

https://www.youtube.com/watch?v=-5wpm-gesOY

По теме. Я за гибкость и прозрачность. Потому, выбрал бы вариант когда фронт сам определяет что для него «сегодня» и передает запрашиваемый интервал на бек.

urxvt ★★★★★
()
Ответ на: комментарий от asdpm

Опять демагогия не в толксах?

Время в будущем — не обязательно time instant и в контексте топика — скорее не time instant.

И если в пути

Для достаточно близких дат не применимо.

x3al ★★★★★
()
Ответ на: комментарий от x3al

RTFM нужно тебе

Я:

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

Ты:

Если она продаётся на календарный год? Нельзя поскольку 0:00 может сместиться, наприме

Я всё четко и понятно написал касаемо примера: куплено на время. Не искажай мои слова. Ты отвечаешь на одно, а критикуешь другое (свой пример).

Опять демагогия

У тебя очевидно, да.

Если она продаётся на календарный год?

А если ты цирковой клоун пишущий на лор в антракте? Не юли!

Твоя фраза:

Таймштампы будущего нельзя хранить только с offset’ом.
Если добавить отдельное поле под таймзону (не оффсет) — можно

Тебе было показано, что ты несешь чушь. Ты сел в лужу.

asdpm
()
Ответ на: комментарий от bugfixer

Это просто arbitrary chosen starting point.

Ага. И главное слово тут не arbitrary, а chosen.

Вот принято описывать в UTC

Это называется «привязаться к UTC»

но можно описать и по другому.

Нет, уже нельзя, потому что см. «принято описывать в UTC»

Вы в принципе не можете привязаться к абсолютному времени не используя одну из общеизвестных TZ.

Привязаться. Привязаться. Привязаться и быть привязанным. Ага?)

thesis ★★★★★
()
Ответ на: комментарий от asdpm

Таймштампы будущего нельзя хранить только с offset’ом.

Окей, исправляю: не все таймштампы для будущих дат есть exact moment of time. В контексте топика — скорее они привязаны к wall clock и будут двигаться (потому, что топик буквально про календари и события). Для таких событий недостаточно iso8601

x3al ★★★★★
()
Ответ на: комментарий от x3al

Принято. Обзывательства беру обратно.

Кстати в контексте топика так и не выяснено в каком виде он их накапливает.

-

Наверное, идеальная система топикстартера была бы такой:

1) где-то нужно именно с timezone abbreviation. В понедельник в 10 придет сантехник, если MSK вдруг поменяет meaning, то он придет всё же в 10 по MSK (в другой time instant).

2) где-то именно instant c offset (таких примеров очевидно полно)

3) где нужно «naive» значение в неизвестном динамическом localtime. («завтра лечь спать до 11 вечера»)

asdpm
()
Ответ на: комментарий от thesis

Это называется «привязаться к UTC»

Нет, не называется. У момента времени нет TZ. Это одно и тоже мгновение что в Африке, что в Японии. TZ есть только у его описания, и у любого момента времени число таких эквивалентных описаний будет равно числу общеизвестных на тот момент TZ.

bugfixer ★★★★
()
Ответ на: комментарий от bugfixer

Ну давай еще теорию относительности по-быстрому переизобретем, во-первых.
И речь же не про абстрактный «момент времени», а про unix epoch time, во-вторых.

Нет, не называется

А вот и да.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Ну давай еще теорию относительности по-быстрому переизобретем

Никто ничего не изобретает.

И речь же не про абстрактный «момент времени», а про unix epoch time

Именно. TZ применимо только к паре Date+Time, unix epoch time таким объектом не является и от TZ не зависит никак.

А вот и да.

Ну вот, и тут детский сад начался…

bugfixer ★★★★
()
Ответ на: комментарий от bugfixer

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

thesis ★★★★★
()
Ответ на: комментарий от bugfixer

Чего общего у time_t = 1234567890 с UTC?

Астанавитесь!!1

https://en.m.wikipedia.org/wiki/Unix_time#:~:text=The%20Unix%20epoch%20is%2000,UTC%20on%201%20January%201970.

До тех пор, пока мы не говорим о времени, time_t = 1234567890 - просто число, цифра. Но как только мы хотим привести его ко времени, мы прибавляем к нему полночь первого января 70 года по Гринвичу!

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от bugfixer

А могло

Но не стало и поэтому не интересует.

Где здесь UTC

В ОПРЕДЕЛЕНИИ, В ОПРЕДЕЛЕНИИ, В ОПРЕДЕЛЕНИИ, БУКВАЛЬНО В ОПРЕДЕЛЕНИИ, чувак, да что же с тобой не так-то.

thesis ★★★★★
()