android 系統日歷 插入重復事件規則 RRULE


英文原文:https://tools.ietf.org/html/rfc5545#section-3.8.5.3

 

重復規則 RRULE(Recurrence Rule) 屬於 calendar 屬性中的一個,配合 dtstart 可以完整描述一個事件的重復行為並計算出重復事件的具體發生 (Occurence)。

重復規則包含多個屬性, 每個屬性以 NAME = VALUE 對的形式存在, 屬性與屬性之間用分號區分, 屬性之間沒有特定的順序要求,在同一個重復規則中每個屬性最多只能出現一次。

FREQ
FREQ 屬性表示重復規則的類型, 是重復規則中必須定義的一條屬性。 可選的 VALUE 有:
SECONDLY, 表示以秒為間隔單位進行重復。
MINUTELY, 表示以分鍾為間隔單位進行重復。
HOURLY, 表示以小時為間隔單位進行重復。
DAILY, 表示以天為間隔單位進行重復。
WEEKLY, 表示以周為間隔單位進行重復。
MONTHLY, 表示以月為間隔單位進行重復。
YEARLY, 表示以年為間隔單位進行重復。

INTERVAL
INTERVAL 屬性表示重復規則的間隔, 必須為正整數。 默認值為1, 對應上述不同的 FREQ 值分別表示每一秒,每一分鍾, 每一小時, 每一天, 每一周, 每一月, 每一年。

UNTIL
UNTIL 屬性定義了一個日期-時間值,用以限制重復規則。 這個日期-時間值表示這個重復規則的最后一次事件的發生時間。 如果重復規則中未包含 UNTIL 和 COUNT 屬性, 則表示該重復規則無限重復。

COUNT
COUNT 屬性通過定義重復事件的發生次數來限制重復規則。 正整數。

BYSECOND, BYMINUTE, BYHOUR
BYSECOND 取值范圍 0 - 59, 可以理解為 “…… 的 n 秒”。
BYMINUTE 取值范圍 0 - 59, 可以理解為 “…… 的 n 分”。
BYHOUR 取值范圍 0 - 23, 可以理解為 “…… 的 n 時”。

BYDAY
BYDAY 取值范圍: MO(周一), TU(周二), WE(周三), TU(周四), FR(周五), SA(周六), SU(周日)。可以有多個值,用逗號分隔。

每個值可以在前面加上一個正整數(+n)或者負整數(-n),用以在 MONTHLY 或者 YEARLY 的重復類型中表示第 n 個周幾。 例如,在一個 MONTHLY 類型的重復規則中, +1MO(或者1MO)表示這個月的第1個周一,如果是 -1MO 則表示這個月的最后1個周一。

如果前面沒有數字,則表示在這個重復類型中的所有的周幾, 比如在一個 MONTHLY 的重復類型中, MO 表示這個月里所有的周一。

BYMONTHDAY
BYMONTHDAY 取值范圍 1 - 31 或者 -31 - -1,表示一個月的第幾天。 比如, -10 表示一個月的倒數第10天。可以有多個值,用逗號分隔。

BYYEARDAY
BYYEARDAY 取值范圍 1 - 366 或者 -366 - -1, 表示一年的第幾天。 比如, -1 表示一年的最后一天, 306 表示一年的第306天。可以有多個值,用逗號分隔。

BYWEEKNO
BYWEEKNO 取值范圍 1 - 53 或者 -53 - -1, 表示一年的第幾周, 只在 YEARLY 類型的重復規則中有效。 比如, 3 表示一年的第 3 周。可以有多個值,用逗號分隔。(注:一年的第一周是指第一個至少包含該年4天時間的那一周)

BYMONTY
BYMONTH 取值范圍 1 - 12, 表示一年的第幾個月。可以有多個值,用逗號分隔。

WKST
WKST 取值范圍 MO, TU, WE, TH, FR, SA, SU。 默認值為 MO。 當一個 WEEKLY 類型的重復規則, INTERVAL 大於 1, 且帶有 BYDAY 屬性時, 則必須帶有 WKST 屬性。 當一個 YEARLY 類型的重復規則帶有 BYWEEKNO 屬性時, 也必須帶有 WKST 屬性。

BYSETPOS

BYSETPOS 取值范圍 1 - 366 或者 -366 - -1, 表示規則指定的事件集合中的第n個事件, 必須與另外的 BYxxx 屬性共同使用。 比如,每月的最后一組工作日可以表示為: RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1

如果一個 BYxxx 屬性的值超過了它對應的范圍,則該屬性會被忽略。

當有多個 BYxxx 屬性存在的時候, 在代入了 FREQ 和 INTEVAL 屬性后,按照以下順序代入到已有規則上:BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY, BYHOUR, BYMINUTE, BYSECOND,BYSETPOS

例如: RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9; BYMINUTE=30

首先,將 INTERVAL=2 代入到 FREQ=YEARLY 上,得到“每2年”, 然后在這基礎上代入 BYMONTH=1 得到
“每2年的1月”, 再代入 BYDAY=SU, 得到“每2年的1月的所有周日”, 再代入 BYHOUR=8,9, 得到
“每2年的1月的所有周日的8點和9點”(注意是8點和9點,不是8點到9點), 最后代入 BYMINUTE=30, 得到“每2年的1月的所有周日的8點30分和9點30分”。
規則中未注明的時間信息,以開始時間(dtstart)為准。

示例:
每天發生一次,重復10次:
RRULE:FREQ=DAILY;COUNT=10

每天發生一次,直到1997年12月24日:
RRULE:FREQ=DAILY;UNTIL=19971224T000000Z

每2天發生一次,直到永遠:
RRULE:FREQ=DAILY;INTERVAL=2

每10天發生一次,重復5次:
RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5

當前日期為1998年1月1日9點0分0秒,之后的3年里每年的1月每天發生一次:
RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
或者:
RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1

每周一次,共發生10次:
RRULE:FREQ=WEEKLY;COUNT=10

每周一次,直到1997年12月24日:
RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z

每2周一次, 直到永遠:
RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU

當前時間為1997年9月2日9點0分0秒,每周二和周四各發生一次,持續5周:
RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH
或者:
RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH

每周一, 周三, 周五各一次,直到1997年12月24日:
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR

每2周的周二和周四各發生一次,共發生8次: RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH

每月的第一個周五發生一次,共發生10次:
RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR

每月的第一個周五發生一次,直到1997年12月24日:
RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR

每2個月的第一個周日和最后一個周日個發生一次,共發生10次: RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU

每月的倒數第二個周一發生一次,共發生6次:
RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO

每月的倒數第三天發生一次,直到永遠:
RRULE:FREQ=MONTHLY;BYMONTHDAY=-3

每月的第2天和第15天各發生一次,共發生10次:
RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15

每月的第1天和最后1天各發生一次,共發生10次:
RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1

每個18個月的1號至15號每天發生一次,共發生10次:
RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15

每2個月的所有周二每天發生一次:
RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU

每年6月和7月各發生一次,共發生10次:
RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7

每2年的一月,二月,三月各發生一次,共10次:
RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3

每3年的第一天,第100天和第200天各發生一次,共10次:
RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200

每年的第20個周一發生一次,直到永遠:
RRULE:FREQ=YEARLY;BYDAY=20MO

每年的第20周的周一(以周一為一周起始日)發生一次,直到永遠:
RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO

每年3月的所有周四,直到永遠:
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH

每年6月,7月,8月的所有周四,直到永遠:
RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8

每一個黑色星期五(13號那天為周五)發生一次,直到永遠:
RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13

每月第一個周日之后那一周的周六發生一次,直到永遠:
RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13

每4年的11月的第一個周一之后的那個周二發生一次,直到永遠
RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8

The 3rd instance into the month of one of Tuesday, Wednesday or Thursday, for the next 3 months(沒法翻譯,自己理解):
RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3

每月的倒數第2個工作日,直到永遠:
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM