@raiboon

Как спроектировать календарь?

Нужно реализовать функциональность календаря и реккурентных напоминаний. И у меня взрывается мозг.
Как хранить даты? В местной для пользователя таймзоне или в unix timestamp? А что делать, если часовой пояс изменится? Из-за закона, меняющего местное время, или если пользователь будет в другой зоне во время события?
Как хранить рекуррентные события? Каждый раз динамически расчитывать? А что если одно из событий пользователь захочет поменять? А если есть конечная дата рекурентных событий, может их сразу создать в бд?
И что-то мне подсказывает, что все эти проблемы уже многократно были решены, но мне не удается загуглить, как спроектированы крупные календари вроде аутлука/гуглокалендарей.
  • Вопрос задан
  • 38 просмотров
Решения вопроса 2
dimonchik2013
@dimonchik2013
Антон Цуцанский, нехороший человек
загугли как спроектированиы библиотеки

например
https://dateparser.readthedocs.io/en/latest/

там все просто - нормализация к UTC и проверка граничных состояний между днями датами
Ответ написан
Nigrimmist
@Nigrimmist
Asp.net senior developer
Даты хранить в UTC, в настройках запоминать текущий часовой пояс пользователя и ко применять его ко всем датам (либ всяких умных уже хватает, ищи)
Про рекуррентные - т.к. обычно у юзера таких дат не так много - например можно рассчитать одну ближайшую дату на момент создания.
На фоне у тебя будет работать job, который будет раз в минуту просчитывать для всех пользователей ,у которых есть рекуррентные события - не изменилось ли что-то(не прошёл ли ближайший день, к слову). Когда пользователь открывает календарь - ты можешь "на лету" прогнозировать отталкиваясь от того, что рекуррентное событие создано для него и отталкиваясь от времени/даты - учитывая просматриваемые даты/месяцы - скалькулировать даты и вывести грубо говоря. Там и подкешировать на время можно, чтобы не делать это каждую минуту при обновлении страницы/календаря.

если какое-то событие пользователь хочет поменять - заносишь в базу ссылку на рекуррент, и изменения. учитываешь это всё при построении модели "на лету".

"сразу создать в базе" так себе идея - создаст он "раз в час на протяжении 10 лет" - долго твоя база пустой не проживёт, да и чтобы что не очень понятно.

Конкретные экшены по точечным событиям - в базу. Вывод на экран - рантайм. Я бы так делал
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы