Вопрос определения правила повторения (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 представляет от десятого до последнего дня месяца.