Вопрос определения правила повторения (RFC2445) - PullRequest
6 голосов
/ 30 января 2009

Я использую реализацию 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 ]

17 голосов
/ 01 февраля 2009

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

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

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

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

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

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

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

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

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

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

...