Надежное и полное расширение или RRULE в python

Используя dateutil.rrulestr, мне удается расширить некоторые повторения, например, такое, которое выглядит так:

DTSTART;TZID=Europe/Zurich:20100930T183000
DTEND;TZID=Europe/Zurich:20100930T193000
RRULE:FREQ=DAILY;UNTIL=20101005T163000Z
BEGIN:VTIMEZONE
...

используя, например:

my_rrule.between(datetime.datetime(2010, 10, 2, 11, 00, tzinfo=pytz.utc),
                 datetime.datetime(2010, 10, 9, 11, 00, tzinfo=pytz.utc)))

Однако это дает мне только время начала событий, а не время окончания. Есть ли способ получить конец времен тоже? (чище, чем вычислять дельту начала и конца самостоятельно и применять ее к каждому времени начала).

Также некоторые повторения могут быть для однодневных событий и быть в виде:

DTSTART;VALUE=DATE:20120225
DTEND;VALUE=DATE:20120226
RRULE:FREQ=WEEKLY;BYDAY=SA
BEGIN:VTIMEZONE
...

Если я попытаюсь расширить это с помощью того же вызова between(), я получаю сообщение об ошибке:

TypeError: can't compare offset-naive and offset-aware datetimes

Есть ли какой-нибудь запрос, который будет работать для любого типа повторения (в идеале возвращая значения даты или даты и времени, в зависимости от случая)?


person Gnurfos    schedule 23.02.2012    source источник


Ответы (1)


dateutil.rrule и друзья не имеют представления о длительности: они повторяют правила мгновений во времени.

Мое решение состояло в том, чтобы заменить rruleset настраиваемым классом, который также принимает продолжительность (или предоставляет ее по умолчанию).

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

person Matthew Schinckel    schedule 21.06.2012