Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ICal4j中的递归规则_Java_Icalendar_Ical4j_Rfc5545 - Fatal编程技术网

Java ICal4j中的递归规则

Java ICal4j中的递归规则,java,icalendar,ical4j,rfc5545,Java,Icalendar,Ical4j,Rfc5545,我正在尝试使用创建.ics文件。 但是,当我尝试添加一个重复时,它失败了,抛出了一个验证异常: 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(Cal

我正在尝试使用创建
.ics
文件。
但是,当我尝试添加一个重复时,它失败了,抛出了一个
验证异常

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);
如果没有此规则,它可以正常工作,但我想每周一添加此事件

直到2011年12月12日(日期由日期返回)。有什么想法吗?

我对这个API也有类似的问题。不幸的是,我现在没有代码,但我记得问题是有些属性是“可选的”。有一个允许他们注册的API。我建议您下载源代码并查看方法
验证的功能。您将看到它验证属性是否在集合(或映射)中。然后找到将属性添加到此集合的方法

如果在实现源代码时遇到问题,只需反编译类文件即可。我个人是用这个包裹做的。我使用eclipse插件对没有关联源代码的每个类进行反编译:

很抱歉,我的回答不够具体,但我希望它能有所帮助。祝您好运。

必须将reccurrence rule(RRULE)属性添加到日历中的特定事件(VEVENT),而不是日历本身。e、 g

myEvent.getProperties().add(rule);
此外,如果您希望事件发生在星期一,您可能应该使用如下规则:

FREQ=WEEKLY;BYDAY=MO;UNTIL=<date>
FREQ=每周;BYDAY=MO;直到=
这是我的想法,因此最好检查RFC以确保:

下面是我的重复规则的一个例子 每周定期规则为

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>
类将具有创建规则和生成日期的方法:

class-DateUtils{
公共静态字符串getMonthlyRecurrenceRule(短间隔、布尔结束、整数出现、StringBuilder结束时间、短月天数、字符串星期天数){
StringBuilder monthlyRecurrenceRule=新StringBuilder(“RRULE:FREQ=每月”);
if(interval!=null&&interval.intValue()>0)
monthlyRecurrenceRule.append(“;INTERVAL=”).append(INTERVAL.toString());
if(dayOfMonth!=null&&dayOfMonth>0)
monthlyRecurrenceRule.append(“;BYMONTHDAY=“).append(dayOfMonth.toString());
其他的
monthlyRecurrenceRule.append(“;BYDAY=”).append(dayOfWeek);
if(endsNever){
//将endtime设置为startdate+10年
monthlyRecurrenceRule.append(“;UNTIL=”).append(“20271231T090000Z”);
}
否则{
if(出现次数!=null&&employments.intValue()>0)
monthlyRecurrenceRule.append(“;COUNT=”).append(executions.toString());
其他的
monthlyRecurrenceRule.append(“;UNTIL=”).append(endTime.toString());
}
返回monthlyRecurrenceRule.toString();
}
公共静态集getRecurrenceDates(字符串rRule、LocalDate startDate)引发ParseException异常{
Set recurrenceDates=new HashSet();
for(LocalDate日期:LocalDateIteratorFactory.createLocalDateIterable(rRule,startDate,true)){
复发日期。添加(日期);
}
复发日期;
}   
}

您也可以在这里的项目报告中看到源代码:类似的代码。但我不知道示例中使用了什么库。您从哪里获得CalendarUtils.getRecurrenceDates(..)(存储库库、git链接等)?
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;
            }   

        }