5

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 2011dateTo

4

3 に答える 3

5

繰り返しルール (RRULE) プロパティは、カレンダー自体ではなく、カレンダーの特定のイベント (VEVENT) に追加する必要があります。例えば

myEvent.getProperties().add(rule);

また、イベントを月曜日に発生させたい場合は、おそらく次のようなルールを使用する必要があります。

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

これは私の頭の中から外れているので、RFC を確認して確認することをお勧めします。

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

于 2011-10-17T22:54:02.840 に答える
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;
            }   

        }
于 2016-09-23T08:41:09.680 に答える
-1

この API でも同様の問題がありました。残念ながら、現在コードはありませんが、一部のプロパティが「オプション」であるという問題があったことを覚えています。それらの登録を可能にする API があります。ソース コードをダウンロードして、メソッドの機能を確認することをお勧めしますvalidate。プロパティがコレクション (またはマップ) にあることを確認することがわかります。次に、このコレクションにプロパティを追加するメソッドを見つけます。

ソース コードの作成に問題がある場合は、クラス ファイルを逆コンパイルしてください。私は個人的にこのパッケージでこれを行いました。ソースコードが関連付けられていないすべてのクラスを逆コンパイルするEclipseにプラグインを使用しました:http://java.decompiler.free.fr/?q=jdeclipse

回答が具体的でなくて申し訳ありませんが、参考になれば幸いです。幸運を。

于 2011-10-16T16:25:00.600 に答える