1

考虑下面提到的带有 RRULE 的 Google 日历中的以下重复事件。

BEGIN:VEVENT
DTSTART;TZID=Asia/Calcutta:20170111T020000
DTEND;TZID=Asia/Calcutta:20170111T050000
RRULE:FREQ=DAILY;UNTIL=20170116T203000Z
DTSTAMP:20170110T150957Z
CREATED:20170110T150942Z
DESCRIPTION:
LAST-MODIFIED:20170110T150942Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Repeat event test
TRANSP:OPAQUE
END:VEVENT

如果现在通过在 1 月 14 日将重复系列分为两部分(编辑此事件和未来事件)来编辑此事件,则此事件的 RRULE 更改为以下

RRULE:FREQ=DAILY;UNTIL=20170113T182959Z

为什么 UNTIL 的值设置为比 1 月 14 日重复的 RECURRENCEID/DTSTART 值小1 秒,而不是设置为 1 月 13 日重复的 DTSTART 值。是否有标准规定在这种情况下 RRULE 中的 UNTIL 值必须以这种方式设置(即少 1 秒)?

4

2 回答 2

1

你不会找到任何标准提到这一点。https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10提到如何

如果 UNTIL 指定的值与指定的重复同步,则此 DATE 或 DATE-TIME 将成为重复的最后一个实例。

但它并没有强制要求该值必须与循环同步,也没有提到它应该少 1 秒。

我怀疑这只是为了方便开发人员,因为截止日期是他正在操纵的 14 日,而之前的实例需要计算。

于 2017-01-10T17:41:20.120 回答
0
public String pushAppointmentsToCalender(Activity curActivity, String title, String addInfo, long startDate, boolean needReminder) {
    try {
        String eventUriString = "content://com.android.calendar/events";
        ContentValues eventValues = new ContentValues();
        eventValues.put("calendar_id", 1); // id, We need to choose from
        // our mobile for primary
        //CalendarContract.EXTRA_EVENT_END_TIME
        // its 1
        eventValues.put("title", title);
        eventValues.put("description", addInfo);
        eventValues.put("dtstart", startDate);
        eventValues.put("dtend", startDate);

        String untileDate = "20220515";
        switch (repeatSelection) {
            case "Every Day":
                if (!untileDate.equals("")) {
                    eventValues.put("rrule", "FREQ=DAILY;UNTIL=" + untileDate);
                } else {
                    eventValues.put("rrule", "FREQ=DAILY");
                }
                break;
            case "Every Week":
                if (!untileDate.equals("")) {
                    eventValues.put("rrule", "FREQ=WEEKLY;UNTIL=" + untileDate);
                } else {
                    eventValues.put("rrule", "FREQ=WEEKLY");
                }
                break;
            case "Every Month":
                if (!untileDate.equals("")) {
                    eventValues.put("rrule", FREQ=MONTHLY;UNTIL=" + untileDate);

                } else {
                    eventValues.put("rrule", "FREQ=MONTHLY");
                }
                break;
            case "Custom":
                switch (frequency) {
                    case "1":
                        if (!untileDate.equals("")) {
                            eventValues.put("rrule", "FREQ=DAILY;INTERVAL=" + Integer.parseInt(every) + ";UNTIL=" + untileDate);
                        } else {
                            eventValues.put("rrule", "FREQ=DAILY;INTERVAL=" + Integer.parseInt(every));
                        }
                        break;
                    case "3":
                        if (!untileDate.equals("")) {
                            eventValues.put("rrule", "FREQ=WEEKLY;INTERVAL=" + Integer.parseInt(every) + ";UNTIL=" + untileDate);
                        } else {
                            eventValues.put("rrule", "FREQ=WEEKLY;INTERVAL=" + Integer.parseInt(every));
                        }
                        break;
                    case "2":
                        if (!untileDate.equals("")) {
                            eventValues.put("rrule", "FREQ=MONTHLY;INTERVAL=" + Integer.parseInt(every) + ";UNTIL=" + untileDate);
                        } else {
                            eventValues.put("rrule", "FREQ=MONTHLY;INTERVAL=" + Integer.parseInt(every));
                        }
                        break;
                    case "4":
                        if (!untileDate.equals("")) {
                            eventValues.put("rrule", "FREQ=YEARLY;INTERVAL=" + Integer.parseInt(every) + ";UNTIL=" + untileDate);
                        } else {
                            eventValues.put("rrule", "FREQ=YEARLY;INTERVAL=" + Integer.parseInt(every));
                        }
                        break;
                }
                break;
        }

        eventValues.put("allDay", 0); //If it is bithday alarm or such
        // kind (which should remind me for whole day) 0 for false, 1
        // for true
        eventValues.put("eventStatus", 1); // This information is
        TimeZone timeZone = TimeZone.getDefault();
        eventValues.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
        eventValues.put("hasAlarm", 1); // 0 for false, 1 for true

        Uri eventUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(eventUriString), eventValues);
        long eventID = Long.parseLong(eventUri.getLastPathSegment());

        if (needReminder) {
            /**************** Event: Reminder(with alert) Adding reminder to event ******************/
            String reminderUriString = "content://com.android.calendar/reminders";
            ContentValues reminderValues = new ContentValues();
            reminderValues.put("event_id", eventID);
            reminderValues.put("minutes", 10); // Default value of the
            // system. Minutes is a
            // integer
            reminderValues.put("method", 1); // Alert Methods: Default(0),
            // Alert(1), Email(2),
            // SMS(3)
            Uri reminderUri = curActivity.getApplicationContext().getContentResolver().insert(Uri.parse(reminderUriString), reminderValues);
        }
        return "" + eventID;
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

重复选择类型=每天,每周,每月,自定义;频率类型=1,2,3,4;当您选择自定义频率类型 1 = DAILY,2=MONTHLY,3=WEEKLY,4 YEARLY;

于 2022-01-19T06:28:28.457 回答