首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICal4j中的递推规则

ICal4j中的递推规则
EN

Stack Overflow用户
提问于 2011-10-16 15:48:14
回答 3查看 7.1K关注 0票数 5

我正在尝试使用.ics创建一个ICal4j文件。

但是,当我试图添加一个递归时,它会失败,引发一个ValidationException

代码语言:javascript
复制
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)

我添加重复的代码是:

代码语言:javascript
复制
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返回的日期)。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2011-10-17 22:54:02

必须将reccurrence规则(RRULE)属性添加到日历中的特定事件(VEVENT),而不是日历本身。例如:

代码语言:javascript
复制
myEvent.getProperties().add(rule);

此外,如果您希望事件发生在星期一,您可能应该使用如下规则:

代码语言:javascript
复制
FREQ=WEEKLY;BYDAY=MO;UNTIL=<date>

这是我的头绪,所以最好检查一下RFC以确保:

https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10

票数 5
EN

Stack Overflow用户

发布于 2016-09-23 08:41:09

下面是我对同一周递归规则的递归规则的一个示例

代码语言:javascript
复制
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"

给出了创建重复规则和日期的代码。

代码语言:javascript
复制
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));

}

类具有创建规则和生成日期的方法:

代码语言:javascript
复制
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;
            }   

        }
票数 0
EN

Stack Overflow用户

发布于 2011-10-16 16:25:00

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

如果在实现源代码方面有困难,只需将类文件解压缩即可。我个人用这个包裹做的。我使用插件来对每个没有相关源代码的类进行解压缩:http://java.decompiler.free.fr/?q=jdeclipse

很抱歉,我的回答不够具体,但我希望这是有帮助的。祝好运。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7785400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档