Вопрос определения правила повторения (RFC2445)

Я использую реализацию Google RFC2445 ( http://code.google.com/p/google-rfc-2445/) для правил повторения. Если я определю ЕЖЕМЕСЯЧНОЕ повторение, начинающееся 30 января, месяцы с менее чем 30 днями (т. Е. Февраль) будут полностью пропущены. Так что Google API вернется 30 января, 30 марта, 30 апреля и т. Д. Не очень хорошо. Я ожидаю, что он вернется: 30 января, 28 февраля, 30 марта, 30 апреля.

Точно так же, если я выберу дату начала 31 января, то любые месяцы с менее чем 31 днем ​​будут пропущены.

Это может быть правильным согласно спецификации RFC2445 или может быть ошибкой. Как вы думаете?

Мой главный вопрос: есть ли способ определить правило, которое гласит: "повторяться 30 числа каждого месяца или в последний день месяца, если 30 числа не существует". Я не верю, что есть. Какие-либо предложения?

Заранее спасибо.

С уважением, Кормак

3 ответа

Решение

Ответ: FREQ= ЕЖЕМЕСЯЧНО;BYMONTHDAY=28,29,30;BYSETPOS=-1, что означает "повторение 30-го числа каждого месяца; или последний день месяца, если 30-го числа не существует".

Что ж, глядя на сам RFC 2445, определенно кажется, что поведение, которое вы видите, правильное:

Если найдены значения частей правила BYxxx, выходящие за пределы доступной области (т. Е. BYMONTHDAY=30 в феврале), они просто игнорируются.

Единственное решение, которое я могу придумать, - это использовать несколько правил повторения, то есть одно на 30-е число каждого месяца, а другое на последний день февраля.

Похоже, вы правы в том, что RFC пропустил эти даты. Если твой DTSTART 31 января, и вы не указываете BYMONTHDAY в вашем правиле повторения (или если BYMONTHDAY 31-го числа), тогда оно будет просто игнорировать это правило в те месяцы, когда такого дня нет:

Если найдены значения частей правила BYxxx, выходящие за пределы доступной области (т. Е. BYMONTHDAY=30 в феврале), они просто игнорируются.

Тем не менее, вы должны иметь возможность указать -1 для BYMONTHDAY и пусть он использует последний день месяца, каким бы он ни был.

Часть правила BYMONTHDAY задает список дней месяца месяца, разделенных символом COMMA (десятичное число ASCII 44). Допустимые значения: от 1 до 31 или от -31 до -1. Например, -10 представляет от десятого до последнего дня месяца.

Другие вопросы по тегам