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
我的笔记