Вам нужно будет обрабатывать отдельно события и происшествия.
Мудрый случай:
Для событий вам нужно будет хранить правила рекуррентности (которые могут быть правилами, подобными указанным в rfc5545, но также явным набором дат, например, rdate в rfc5545), а также исключениями (см. Exdate для rfc5545 и, возможно, exrule, как в rfc2445).
Вам также нужно будет отслеживать изменения в этих правилах:
Изменения в rdate, exdate не являются проблемой, когда они происходят в будущем, и их следует игнорировать в прошлые даты.
Изменения в правилах более сложны, так как влияют на предыдущие события. Мое личное предпочтение состоит в том, чтобы добавить конкретное свойство для старого и нового правила, чтобы указать соответствующие даты начала и окончания действия.
если событие имеет ограниченный промежуток времени (скажем, присутствует свойство COUNT или UNTIL), вы должны сохранить его начало и конец в таблице, чтобы упростить запрос событий (особенно при поиске событий за пределами предварительно рассчитанного временного окна (см. Ниже). ), это может помочь уменьшить количество событий, для которых необходимо выполнить повторное вычисление).
ВСТУПЛЕНИЯ МУДРОГО:
для случаев вы должны хранить экземпляры в предопределенном окне около настоящего (скажем, +/- 6 месяцев или 12 месяцев и рассчитывать на регулярной основе) и вести записи этого, чтобы позволить пересчет, если ваши пользователи хотят видеть дальше в будущем (для вопросы исполнения). вам также следует рассмотреть возможность вычисления индекса (RECURRENCE-ID), чтобы упростить поиск следующего вхождения.
меньше на внутреннем сервере, но больше на внешнем интерфейсе, вы также должны отслеживать изменения в tzid, чтобы спросить пользователя, запланировано ли событие для данного tzid, если оно предназначено для его сохранения в текущем часовом поясе. нуждается в обновлении (подумайте о ком-то на острове Самоа, который запланировал встречу на пятницу, 30 декабря 2011 г., до того, как страна решила, что этот день не будет существовать), аналогично вы можете спросить, подразумевается ли событие, которое происходит в летнее время «никогда не случиться» или «случиться дважды» (подробнее по этой теме здесь )
Примечание:
Возможно, вы захотите рассмотреть поддержку, выходящую за рамки того, что определено в rfc5545 с точки зрения правил повторяемости, а также добавить поддержку для религиозных повторяющихся правил ( см. введение USNO в календари или в печатном издании «Календарные вычисления» (третье издание) от
Э. Рейнгол и Н. Дершовиц).
Поскольку вы спрашиваете о существующей реализации, вы можете легко проверить схему базы данных sunbird (sqlite) или сервера календаря и контактов с открытым исходным кодом Apple , более полный список существующих проектов с открытым исходным кодом для caldav серверы (что, вероятно, является подмножеством того, что вы ищете) доступны здесь )