Даты rrule смещены на неделю - PullRequest
0 голосов
/ 20 января 2019

Я получаю неожиданный результат, используя модуль python-dateutil rrule, и мне интересно, если это WAI.

Я динамически создаю rrule, используя:

dtstart = datetime.date(2019, 1, 7)
until = datetime.date(2029, 11, 29)
freq = MONTHLY
byweekday=MO(2)
interval = 4

Это приводит к следующему правилу

DTSTART:20190107T000000
RRULE:FREQ=MONTHLY;INTERVAL=4;UNTIL=20291129T000000;BYDAY=+2MO

Тем не менее, при генерации дат (циклический цикл по правилу для этого модуля python) я получаю следующие даты:

 [datetime.datetime(2019, 1, 14, 0, 0),
 datetime.datetime(2019, 5, 13, 0, 0),
 datetime.datetime(2019, 9, 9, 0, 0),
 datetime.datetime(2020, 1, 13, 0, 0),
 datetime.datetime(2020, 5, 11, 0, 0),
 datetime.datetime(2020, 9, 14, 0, 0),
 datetime.datetime(2021, 1, 11, 0, 0),
 datetime.datetime(2021, 5, 10, 0, 0),
 datetime.datetime(2021, 9, 13, 0, 0),
 datetime.datetime(2022, 1, 10, 0, 0),
 datetime.datetime(2022, 5, 9, 0, 0),
 datetime.datetime(2022, 9, 12, 0, 0),
 datetime.datetime(2023, 1, 9, 0, 0),
 datetime.datetime(2023, 5, 8, 0, 0),
 datetime.datetime(2023, 9, 11, 0, 0),
 datetime.datetime(2024, 1, 8, 0, 0),
 datetime.datetime(2024, 5, 13, 0, 0),
 datetime.datetime(2024, 9, 9, 0, 0),
 datetime.datetime(2025, 1, 13, 0, 0),
 datetime.datetime(2025, 5, 12, 0, 0),
 datetime.datetime(2025, 9, 8, 0, 0),
 datetime.datetime(2026, 1, 12, 0, 0),
 datetime.datetime(2026, 5, 11, 0, 0),
 datetime.datetime(2026, 9, 14, 0, 0),
 datetime.datetime(2027, 1, 11, 0, 0),
 datetime.datetime(2027, 5, 10, 0, 0),
 datetime.datetime(2027, 9, 13, 0, 0),
 datetime.datetime(2028, 1, 10, 0, 0),
 datetime.datetime(2028, 5, 8, 0, 0),
 datetime.datetime(2028, 9, 11, 0, 0),
 datetime.datetime(2029, 1, 8, 0, 0),
 datetime.datetime(2029, 5, 14, 0, 0),
 datetime.datetime(2029, 9, 10, 0, 0)]

Обратите внимание, что первая дата смещена на неделю!Почему это так?И это ошибка в библиотеке?

Спасибо, Дэвид

1 Ответ

0 голосов
/ 30 января 2019

Это не ошибка в библиотеке.2019-01-14 - это первая дата, соответствующая вашему правилу (это второй понедельник января 2019 года).Очевидно, что python-dateutil решил не включать указанную вами дату начала, что является полностью допустимым.

RRULE указано в RFC 5545 , что указано в Раздел 3.8.5.3 (в разделе «Описание»):

Набор повторений, созданный со значением свойства «DTSTART», не синхронизированный с правилом повторений, не определен.

Какойпо сути, это означает, что нет правильной или неправильной интерпретации, потому что входные данные «повреждены», если начальная дата не соответствует правилу.

Обратите внимание, что многие другие реализации, вероятно, вернут и то и другое, вашу начальную дату 2019-01-07 и результат 2019-01-14.Я не думаю, что любая реализация пропустит 2019-01-14 просто потому, что это первая дата, которая соответствует правилу.Это спорно ли дата начала 2019-01-07 должны быть в результатах или нет, но 2019-01-14 обязательно должны быть там.

...