Определение правила повторения (RFC2445) вопрос
Я использую реализацию RFC2445 Google (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-->
3 ответов
ответ: FREQ=ежемесячно;BYMONTHDAY=28,29,30; BYSETPOS=-1, что переводится как "повторяется 30-го числа каждого месяца; или последний день месяца, если 30-го не существует".
похоже, вы правы насчет того, что RFC пропускает эти даты. Если DTSTART
- 31 января, и вы не указать BYMONTHDAY
в правиле повторения (или если BYMONTHDAY
находится на 31-м), то он просто проигнорирует это правило в месяцах, где нет такого дня:
если найдены значения части правила BYxxx которые выходят за рамки доступных возможностей (то есть, BYMONTHDAY=30 в феврале), они просто игнорируются.
, вы должны можно указать -1 для BYMONTHDAY
и используйте последний день месяца, каким бы он ни был.
часть правила BYMONTHDAY указывает Символ запятой (ASCII decimal 44) разделенный список дней месяца. Допустимые значения от 1 до 31 или от -31 до -1. Например, -10 представляет десятый до последнего дня месяца.
Ну, глядя на RFC 2445 сам он определенно кажется, что поведение, которое вы видите, является правильным:
Если найдены значения части правила BYxxx, которые выходят за пределы доступной области (т. е. BYMONTHDAY=30 в феврале), они просто игнорируются.
единственное решение, которое я могу придумать, это использовать несколько правил повторения, т. е. один для 30-го числа каждого месяца и другой для последнего дня в феврале.