【问题标题】:Recurrence rule in ICal4jICal4j 中的重复规则
【发布时间】:2011-12-08 18:45:48
【问题描述】:

我正在尝试使用ICal4j 创建一个.ics 文件。
但是当我尝试添加 recurrence 时,它会失败,抛出 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 2011dateTo 返回的日期)。有什么想法吗?

【问题讨论】:

    标签: java icalendar ical4j rfc5545


    【解决方案1】:

    我在使用这个 API 时遇到了类似的问题。不幸的是,我现在没有代码,但我记得问题是某些属性是“可选的”。有一个 API 允许他们注册。我建议您下载源代码并查看方法 validate 的作用。您将看到它验证该属性是否在集合(或地图)中。然后只需找到将属性添加到此集合的方法即可。

    如果您在获取源代码时遇到问题,只需反编译类文件即可。我个人用这个包做了这个。我使用插件来反编译每个没有关联源代码的类:http://java.decompiler.free.fr/?q=jdeclipse

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

    【讨论】:

    • 您还可以在此处查看项目报告中的来源:link
    【解决方案2】:

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

    myEvent.getProperties().add(rule);
    

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

    FREQ=WEEKLY;BYDAY=MO;UNTIL=<date>
    

    这不是我的想法,所以最好检查一下 RFC 以确保:

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

    【讨论】:

      【解决方案3】:

      这是我的重复规则的示例 每周重复规则是

      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;
                  }   
      
              }
      

      【讨论】:

      • 类似的代码我有here。但我不知道示例中使用了什么库。您从哪里获得 CalendarUtils.getRecurrenceDates(..)(存储库、git 链接等)?
      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2014-03-13
      • 2014-11-16
      相关资源
      最近更新 更多