Android开发中如何向系统日历插入重复事件规则RRULE
Android系统的重复规则RRULE(RecurrenceRule)属于calendar属性中的一个,配合dtstart可以完整描述一个事件的重复行为并计算出重复事件的具体发生。
重复规则RRULE包含多个属性,每个属性以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
The3rdinstanceintothemonthofoneofTuesday,WednesdayorThursday,forthenext3months(没法翻译,自己理解):
RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
每月的倒数第2个工作日,直到永远:
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
我的笔记