我使用Zimbra日历导出,并希望创建每天发生的所有事件的列表。简化的日历看起来像这样。
BEGIN:VCALENDAR
X-WR-CALNAME:Test-Parking
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:STANDARD
DTSTART:19710101T030000
TZOFFSETTO:+0100
TZOFFSETFROM:+0200
RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
TZNAME:CET
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
RRULE:FREQ=DAILY;COUNT=3;INTERVAL=1
SUMMARY:Day Event 3 Times
DTSTART;VALUE=DATE:20120911
DTEND;VALUE=DATE:20120912
END:VEVENT
BEGIN:VEVENT
SUMMARY:4 hours event
DTSTART;TZID="Europe/Berlin":20120911T090000
DTEND;TZID="Europe/Berlin":20120911T130000
END:VEVENT
END:VCALENDAR
现在我编写了一些代码来过滤事件:
public class CalendarTester {
private Calendar calendar;
private TimeZoneRegistry registry;
public static void main(String[] args) throws Exception {
CalendarTester tester = new CalendarTester();
tester.run();
}
private void run() throws IOException, ParserException, URISyntaxException,
ParseException {
readCalendar();
TimeZone tz = registry.getTimeZone("Europe/Berlin");
SimpleDateFormat formatter = new SimpleDateFormat();
GregorianCalendar cal = new GregorianCalendar(2012,
GregorianCalendar.SEPTEMBER, 10);
cal.set(GregorianCalendar.HOUR_OF_DAY, 0);
cal.set(GregorianCalendar.MINUTE, 0);
cal.set(GregorianCalendar.SECOND, 0);
cal.setTimeZone(tz);
for (int i = 0; i < 5; i++) {
Period p = new Period(new DateTime(cal.getTime()), new Dur(1, 0, 0,
0));
p.setTimeZone(tz);
Rule[] rules = new Rule[1];
rules[0] = new PeriodRule(p);
Filter f = new Filter(rules, Filter.MATCH_ALL);
System.out.println("_____________");
System.out.println(formatter.format(cal.getTime()));
for (Object event : f.filter(calendar
.getComponents(Component.VEVENT))) {
printEvent((VEvent) event, formatter);
}
cal.add(GregorianCalendar.DAY_OF_YEAR, 1);
}
}
private void printEvent(VEvent event, SimpleDateFormat formatter) {
System.out.println("Start: "
+ formatter.format(event.getStartDate().getDate()) + " End: "
+ formatter.format(event.getEndDate().getDate()) + " Summary: "
+ event.getSummary().getValue());
}
private void readCalendar() throws FileNotFoundException, IOException,
ParserException {
FileInputStream fin = new FileInputStream(
"files/Recuring_Calendar_Entry_From_To.ics");
CalendarBuilder builder = new CalendarBuilder();
calendar = builder.build(fin);
registry = builder.getRegistry();
}
}
现在我正确地获得了简单事件,但由于错误的开始和结束时间,3次发生一天事件4次。
_____________
10.09.12 01:00
_____________
11.09.12 01:00
Start: 11.09.12 02:00 End: 12.09.12 02:00 Summary: Day Event 3 Times
Start: 11.09.12 10:00 End: 11.09.12 14:00 Summary: 4 hours event
_____________
12.09.12 01:00
Start: 11.09.12 02:00 End: 12.09.12 02:00 Summary: Day Event 3 Times
_____________
13.09.12 01:00
Start: 11.09.12 02:00 End: 12.09.12 02:00 Summary: Day Event 3 Times
_____________
14.09.12 01:00
Start: 11.09.12 02:00 End: 12.09.12 02:00 Summary: Day Event 3 Times
因此,如果有人知道我必须在导入或过滤器处更改,我会在同一时区内获得所有事件。
任何建议的坦克,Cy
我做了一些测试来弄清楚发生了什么。开始是过滤器的测试:
test/net/fortuna/ical4j/filter/PeriodRuleTest.java
如果我创建一个新的全天活动,就像它显示那里一切都好。 如果我添加一个recure roule,功能就会被破坏。
Recur recur = new Recur("FREQ=DAILY;COUNT=3;INTERVAL=1");
event.getProperties().add(new RRule(recur));
现在,事件与开始日期和后续3天相匹配,如上例所示。 如果我在规则中设置COUNT = 1,则事件现在匹配2次。也许我不理解反复出现的规则?如果我看一下我导出这个事件的网络日历(Zimbra),一切都像我预期的那样。
答案 0 :(得分:0)
我注意到了几件事:
首先,您的“Day Event 3 Times”活动并未使用欧洲/柏林时区作为其日期,因此该活动实际上处于“浮动时间”。如果您当地的时区是欧洲/柏林,那么这可能无关紧要。
其次,同一事件跨越9月11日 - 9月12日。因此,对于重复规则,您将最终得到三个事件实例:
我没有仔细查看代码的作用,但这可以解释为什么你在14 sep上获得匹配。