Вопрос об определении правила повторения (RFC2445)
-
20-08-2019 - |
Вопрос
Я использую реализацию 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-го числа не существует".Я не верю, что это так.Есть какие-нибудь предложения?
Заранее благодарю.
С уважением, Кормак
Решение
Ответ таков: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-е число каждого месяца, а другой за последний день февраля.