Java 每两周一次/google-rfc-2445根据开始日期刷新不同的行为
基于启动时间的RRULE的不同行为: 您好,我目前正在尝试编写一个cron-to-rrule转换器,遇到一些特定规则的问题。 对于以下规则: “频率=年;按月=1,2,3,4,5,6,7,8,9,10,11,12;按月=日=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31;按日=苏,莫,图,我们,TH,FR,SA;按小时=0,10,20;按分钟=0” 日期迭代器的行为因指定的开始时间而异:Java 每两周一次/google-rfc-2445根据开始日期刷新不同的行为,java,icalendar,rrule,rfc2445,biweekly,Java,Icalendar,Rrule,Rfc2445,Biweekly,基于启动时间的RRULE的不同行为: 您好,我目前正在尝试编写一个cron-to-rrule转换器,遇到一些特定规则的问题。 对于以下规则: “频率=年;按月=1,2,3,4,5,6,7,8,9,10,11,12;按月=日=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31;按日=苏,莫,图,我们,TH,FR,SA;按小时=0,10,20;按分钟=0” 日期迭代器的行为因指定的开始时间而
final String rule2 = "FREQ=YEARLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11,12;BYMONTHDAY=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYHOUR=0,10,20;BYMINUTE=0";
final Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-10-01");
final Date startDate2 = new SimpleDateFormat("yyyy-MM-dd").parse("2019-12-01");
System.out.println("Biweekly Rule Date 1");
final List<Date> biweeklyStartDate1 = biweeklyDates(rule2, startDate, 100);
System.out.println("Biweekly Rule Date 1 Result Count " + biweeklyStartDate1.size());
System.out.println("Biweekly Rule Date 2");
final List<Date> biweeklyStartDate2 = biweeklyDates(rule2, startDate2, 100);
System.out.println("Biweekly Rule Date 2 Result Count " + biweeklyStartDate2.size());
private static List<Date> biweeklyDates(final String rule, final Date date, final int limit) {
final RecurrenceRuleScribe scribe = new RecurrenceRuleScribe();
final ParseContext context = new ParseContext();
context.setVersion(ICalVersion.V2_0);
final RecurrenceRule recurrenceRule = scribe.parseText("RRULE:" + rule,null, new ICalParameters(), context);
final DateIterator iterator = recurrenceRule.getDateIterator(date, TimeZone.getTimeZone("GMT"));
final List<Date> values = new ArrayList<>();
while (iterator.hasNext()) {
final Date next = iterator.next();
values.add(next);
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(next));
if (values.size() >= limit) {
break;
}
}
return values;
}
final String rule 2=“FREQ=year;BYMONTH=1,2,3,4,5,6,7,8,9,10,11,12;BYMONTHDAY=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,26,27,28,30,31;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYHOUR=0,10,20;bymin=0”;
最终日期开始日期=新的简化格式(“yyyy-MM-dd”)。解析(“2019-10-01”);
最终日期startDate2=新的简化格式(“yyyy-MM-dd”)。解析(“2019-12-01”);
System.out.println(“双周规则日期1”);
最终清单双周开始日期1=双周开始日期(规则2,开始日期,100);
System.out.println(“每两周规则日期1结果计数”+biweeklyStartDate1.size());
System.out.println(“双周规则日期2”);
最终列表双周开始日期2=双周开始日期(规则2,开始日期2100);
System.out.println(“每两周规则日期2结果计数”+biweeklyStartDate2.size());
私有静态列表双周日期(最终字符串规则、最终日期、最终整数限制){
最终复发划线=新复发划线();
final ParseContext=new ParseContext();
setVersion(ICalVersion.V2_0);
final RecurrenceRule RecurrenceRule=scribe.parseText(“RRULE:+rule,null,new-ICalParameters(),context”);
final DateIterator iterator=recurrenceRule.getDateIterator(日期、时区、getTimeZone(“GMT”);
最终列表值=新的ArrayList();
while(iterator.hasNext()){
final Date next=iterator.next();
值。添加(下一步);
System.out.println(新的SimpleDataFormat(“yyyy-MM-dd”).格式(下一个));
if(values.size()>=limit){
打破
}
}
返回值;
}
在本例中,我尝试使用相同的规则检索100个事件。返回的事件因指定的开始时间而异。
第一个日期将返回预期的100个结果,第二个日期将返回一个无效事件,这似乎是开始日期。
这似乎是由一年中的最后一个月引起的,当指定另一个日期为12月时,似乎会返回相同的报税表。
Google-rfc-2445也有同样的行为,但ical4j和其他一些来自其他语言的rrule评估人员能够产生预期的结果