Как найти пятницу после последней среды месяца?

Какое выражение iCal RRULE следует использовать для поиска пятницы после последней среды месяца? Итак, мне нужно (RRULE:FREQ=MONTHLY;BYDAY=-1WE) + 2 дня...


person Kirill Karahainko    schedule 10.06.2016    source источник
comment
Кто-то может меня поправить, но я думаю, что это нельзя выразить с помощью RRULE.   -  person Evert    schedule 10.06.2016


Ответы (1)


Я согласен с Эвертом, что это невозможно с одним RRULE.

Однако вы можете добиться этого с помощью комбинации нескольких RRULE.

Таким образом, вы можете разделить свое событие на несколько событий, каждое из которых имеет одно из следующих RRULE:

Если среда выпадает на последний или предпоследний день месяца, наша пятница будет 1-го или 2-го числа следующего месяца.

FREQ=MONTHLY;BYMONTHDAY=1,2;BYDAY=1FR

В месяцах с 31 днем ​​​​самая ранняя дата последней среды - 25-е число, поэтому следующая пятница будет одним из дней 27-31:

FREQ=MONTHLY;BYMONTH=1,3,5,7,8,10,12;BYMONTHDAY=27,28,29,30,31;BYDAY=FR

В месяцах с 30 днями самая ранняя дата последней среды — 24-е число, поэтому следующая пятница будет одним из дней 26-30:

 FREQ=MONTHLY;BYMONTH=4,6,9,11;BYMONTHDAY=26,27,28,29,30;BYDAY=FR

Февраль непростой, потому что в невисокосные годы желаемая пятница будет между 24 и 28 числами, а в високосные годы — между 25 и 29 числами. Однако в течение следующих 50 лет будет только один високосный год, в котором 24 февраля будет пятницей, то есть 2040 год (проверьте результат FREQ=MONTHLY=BYMONTHDAY=24; a>), поэтому следующее ПРАВИЛО будет правильным до 2040 года:

FREQ=MONTHLY;BYMONTH=2;BYMONTHDAY=24,25,26,27,28,29;BYDAY=FR

Если вас беспокоят високосные годы, добавьте EXDATE, как показано ниже, и у вас все получится на следующие 100 лет (сделайте эти значения DATE-TIME, если ваша начальная дата имеет время):

EXDATE;VALUE=DATE:20400224,20680224,20960224,21080224

Если вы точно знаете, что ваши клиенты поддерживают несколько RRULE (которые были нерешительно объявлены устаревшими в RFC 5545, но по-прежнему полностью действителен в RFC 2445), вы можете добавить их тоже в одно событие, но я бы не рекомендовал этого делать.

person Marten    schedule 14.06.2016