Я работаю с событиями icalendar, которые используют RRULE иметь дело с повторы;
Теперь я знаю, что некоторые PHP-класс, как когда а также RRules и т.д .. для обработки RRULE, и я уже использую его для выполнения задачи генерации повторяющихся событий, но проблема заключается в производительности с большим диапазоном дат.
Поэтому я решил ускорить задачу генерации повторений, ограничив диапазон (начало & конец) текущими представлениями календаря, которые [ MONTH, WEEK, DAY ]
,
Предполагая, что у нас есть повторяющееся событие, как
FREQ=DAILY;INTERVAL=1;DTSTART:2009-01-01
что я делаю, очевидно, чтобы изменить DTSTART
на сегодняшний день и добавить UNTIL
дата, чтобы ограничить цикл близким диапазоном, и он работает просто отлично. проблема приходит с такими правилами:
FREQ=WEEKLY;BYDAY=SU;DTSTART:2009-01-01
или же
FREQ=WEEKLY;INTERVAL=5;DTSTART:2009-01-01
с такими правилами мой трюк не работает, потому что первоначальная дата начала не соответствует моей зашифрованной сегодняшней дате.
Я безуспешно пытался сделать итерацию, используя DateTime Period и Interval, но не могу понять.
Так что я спрашиваю, это способ узнать, когда заданная дата повторится в моем диапазоне просмотра, который может быть МЕСЯЦ, НЕДЕЛЯ или ОДИН ДЕНЬ.
заранее спасибо, надеюсь, кто-нибудь может мне помочь. 😉
Я знаю, что вопрос уже довольно старый, но я собираюсь ответить на всякий случай.
Здесь нет надежный способ изменить правило, как вы пытаетесь сделать. Как вы заметили, как только вы начинаете иметь что-то большее, чем простое ежедневное / еженедельное / ежемесячное / ежегодное повторение, ваш трюк больше не работает. И вы еще даже не поцарапали поверхность, такие вещи, как BYSETPOS
а также COUNT
настоящий кошмар.
У вас есть только два подхода:
DTSTART
игнорирование всего, что находится перед началом вашего периода, и остановка, как только вы достигнете конца периодаRRULE
, Это можно сделать с помощью процесса исключения (например, ваш RRULE
происходит только в воскресенье и дата не является воскресеньем? Затем откажитесь и двигайтесь дальше). Однако в самых сложных случаях единственным решением является возврат к варианту 1 и вычисление всех вхождений.Хотя вы можете сами их кодировать, я предлагаю использовать для этого библиотеку. Я автор PHP-rrule и с lib вы можете использовать getOccurrencesBetween($begin, $end)
(который реализует вариант 1) и occursAt($date)
(который реализует вариант 2).
Других решений пока нет …