Как можно использовать детали RRULE для реализации «два раза в месяц»? - PullRequest
0 голосов
/ 06 января 2019

Я сопоставляю следующий набор правил повторения с RFC5545 RRULE (для создания событий Календаря Google):

  • Никогда
  • Ежедневно
  • Еженедельные
  • EveryOtherWeek
  • TwiceAMonth
  • Every4Weeks
  • в месяц
  • EveryOtherMonth
  • Every3Months
  • Every4Months
  • TwiceAYear
  • Год
  • EveryOtherYear

Некоторые из них проще, чем другие (рассмотрим Every4Weeks против TwiceAMonth) и уже реализованы.


Предполагая, что это может быть выражено в RRULE, и у меня есть начальная дата 2017/08/24 (если дата начала уместна), каким должен быть мой RRULE, например, TwiceAMonth?


Бонус: если кто-то придумает РУБЛИ для «раз в две недели», «два раза в год» и т. Д., Я буду вечно благодарен.

1 Ответ

0 голосов
/ 07 января 2019

Чтобы кодировать RRULE, нужно быть очень конкретным. «Два раза в неделю / месяц / год» - если бы вы сказали это человеку, смогут ли они определить, какие именно дни в 2019 году?

Каждая последовательность нуждается в DTSTART, и она определенно необходима для повторяющейся последовательности, которая зависит или определяется этой датой. Например, для начала каждой недели потребуется день, и он может повторяться каждые 14 дней или каждые 2 недели. Два раза в месяц: в какие дни? релевантен день недели? дни определяются началом или концом месяца?

В вашем распоряжении есть комбинации FREQ, INTERVAL и всех BYDAY, BYMONTHDAY, BYSETPOS и т. Д. Некоторые «увеличивают» количество дней, а некоторые «ограничивают» количество дней.

В самой спецификации есть несколько примеров https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html. Вот еще несколько примеров:

Дважды в месяц 1-го и 15-го

RRULE:FREQ=MONTHLY;BYMONTHDAY=1,15

Дважды в месяц в первый и третий четверг

DTSTART;TZID=America/New_York:20170824T000000
RRULE:FREQ=MONTHLY;BYDAY=1TH,3TH

Каждую неделю, начиная с 24 августа 2018 года

DTSTART;TZID=America/New_York:20170824T000000
RRULE:FREQ=WEEKLY;INTERVAL=2

Два раза в год со 2-го по последний день февраля и августа

RRULE:FREQ=YEARLY;BYMONTHDAY=-2;BYMONTH=2,8

Дважды в год в последний день и 50-й день

RRULE:FREQ=YEARLY;BYSETPOS=-1,50

Есть много возможных комбинаций. https://icalevents.com/2447-need-to-know-the-possible-combinations-for-repeating-dates-an-ical-cheatsheet/

...