datetime — получение следующего вхождения даты между периодами

Я работаю с событиями 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, но не могу понять.

Так что я спрашиваю, это способ узнать, когда заданная дата повторится в моем диапазоне просмотра, который может быть МЕСЯЦ, НЕДЕЛЯ или ОДИН ДЕНЬ.

заранее спасибо, надеюсь, кто-нибудь может мне помочь. 😉

0

Решение

Я знаю, что вопрос уже довольно старый, но я собираюсь ответить на всякий случай.

Здесь нет надежный способ изменить правило, как вы пытаетесь сделать. Как вы заметили, как только вы начинаете иметь что-то большее, чем простое ежедневное / еженедельное / ежемесячное / ежегодное повторение, ваш трюк больше не работает. И вы еще даже не поцарапали поверхность, такие вещи, как BYSETPOS а также COUNT настоящий кошмар.

У вас есть только два подхода:

  1. Любой цикл через все вхождения, начиная с DTSTART игнорирование всего, что находится перед началом вашего периода, и остановка, как только вы достигнете конца периода
  2. Или сгенерируйте полный список дат вашего периода и проверьте каждую RRULE, Это можно сделать с помощью процесса исключения (например, ваш RRULE происходит только в воскресенье и дата не является воскресеньем? Затем откажитесь и двигайтесь дальше). Однако в самых сложных случаях единственным решением является возврат к варианту 1 и вычисление всех вхождений.

Хотя вы можете сами их кодировать, я предлагаю использовать для этого библиотеку. Я автор PHP-rrule и с lib вы можете использовать getOccurrencesBetween($begin, $end) (который реализует вариант 1) и occursAt($date) (который реализует вариант 2).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]