我正在尝试使用ICal4j创建.ics
文件
但是当我尝试添加重复时,它会失败,抛出ValidationException
:
net.fortuna.ical4j.model.ValidationException: Invalid property: RRULE at
net.fortuna.ical4j.model.Calendar.validate(Calendar.java:297) at
net.fortuna.ical4j.model.Calendar.validate(Calendar.java:257) at
net.fortuna.ical4j.data.CalendarOutputter.output(CalendarOutputter.java:96) at
net.fortuna.ical4j.data.CalendarOutputter.output(CalendarOutputter.java:83)
我添加重复的代码是:
Recur recur = new Recur(Recur.WEEKLY,null);
recur.setUntil( new DateTime(dateTo.getTime()) );
RRule rule = new RRule(recur);
cal.getProperties().add(rule);
没有这个规则它可以正常工作,但我希望每个星期一都添加这个事件
直到12 December 2011
(由dateTo
返回的日期)。有什么想法吗?
答案 0 :(得分:5)
必须将重新生成规则(RRULE)属性添加到日历中的特定事件(VEVENT),而不是日历本身。 e.g。
myEvent.getProperties().add(rule);
此外,如果您希望事件发生在星期一,您应该使用如下规则:
FREQ=WEEKLY;BYDAY=MO;UNTIL=<date>
这是我的头脑,所以最好检查RFC以确定:
答案 1 :(得分:0)
以下是我的同步重复规则的示例 每周重复规则是
RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=MO;UNTIL=20161222T000000Z
RRULE:FREQ=MONTHLY;INTERVAL=<Every month/with some interval>;BYDAY=<Day of week>;UNTIL=<Until Date>
因此,您的规则就像: "RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=MO;UNTIL=20111212T000000Z"
给出了创建重复规则和日期的代码
class CreateRule{
static {
weekMap.put(Short.valueOf("0"), "SU");
weekMap.put(Short.valueOf("1"), "MO");
weekMap.put(Short.valueOf("2"), "TU");
weekMap.put(Short.valueOf("3"), "WE");
weekMap.put(Short.valueOf("4"), "TH");
weekMap.put(Short.valueOf("5"), "FR");
weekMap.put(Short.valueOf("6"), "SA");
}
Short repeatCountMonthly = repeatCount != null ? repeatCount : 0;
String weekDay = weekMap.get(<repeatMonthWeek>);
//Create recurrence Rule
String monthlyRecurrenceRule = DateUtils.getMonthlyRecurrenceRule(repeatCountMonthly,endsNever, endsAfterOccurrences,endTime,repeatMonthDay,weekDay);
//Create recurrence Dates
Set<LocalDate> monthlyStartDates = CalendarUtils.getRecurrenceDates(monthlyRecurrenceRule,
LocalDate.fromDateFields(startDate));
}
类将具有创建规则和生成日期的方法:
class DateUtils{
public static String getMonthlyRecurrenceRule(Short interval,boolean endsNever,Integer occurrences, StringBuilder endTime,Short dayOfMonth,String dayOfWeek){
StringBuilder monthlyRecurrenceRule = new StringBuilder("RRULE:FREQ=MONTHLY");
if(interval!=null&&interval.intValue()>0)
monthlyRecurrenceRule.append(";INTERVAL=").append(interval.toString());
if(dayOfMonth!=null && dayOfMonth>0)
monthlyRecurrenceRule.append(";BYMONTHDAY=").append(dayOfMonth.toString());
else
monthlyRecurrenceRule.append(";BYDAY=").append(dayOfWeek);
if(endsNever){
//set endtime as startdate+10 years
monthlyRecurrenceRule.append(";UNTIL=").append("20271231T090000Z");
}
else{
if(occurrences!=null&&occurrences.intValue()>0)
monthlyRecurrenceRule.append(";COUNT=").append(occurrences.toString());
else
monthlyRecurrenceRule.append(";UNTIL=").append(endTime.toString());
}
return monthlyRecurrenceRule.toString();
}
public static Set<LocalDate> getRecurrenceDates(String rRule,LocalDate startDate) throws ParseException{
Set<LocalDate> recurrenceDates = new HashSet<LocalDate>();
for (LocalDate date : LocalDateIteratorFactory.createLocalDateIterable(rRule, startDate, true)) {
recurrenceDates.add(date);
}
return recurrenceDates;
}
}
答案 2 :(得分:-1)
我有这个API的类似问题。不幸的是我现在没有代码,但我记得问题是某些属性是“可选的”。有一个允许他们注册的API。我建议你下载源代码并查看方法validate
做了什么。您将看到它验证属性是否在集合(或映射)中。然后找到为此集合添加属性的方法。
如果您在实现源代码时遇到麻烦,只需反编译类文件即可。我个人用这个包做过这个。我使用插件来进行eclipse,它反编译了每个没有相关源代码的类:http://java.decompiler.free.fr/?q=jdeclipse
对不起,我的答案不够具体,但我希望无论如何都有帮助。祝你好运。