【问题标题】:Value of UNTIL in RRULE when breaking a repeat event中断重复事件时 RRULE 中 UNTIL 的值
【发布时间】:2017-05-25 03:35:37
【问题描述】:

考虑以下在 Google 日历中使用 RRULE 的重复事件,如下所述。

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 秒 小于 1 月 14 日重复的 RECURRENCEID/DTSTART 值,而不是设置为 1 月 13 日重复的 DTSTART 值。是否有标准规定这种情况下 RRULE 中的 UNTIL 值必须以这种方式设置(即少 1 秒)?

【问题讨论】:

    标签: google-calendar-api icalendar rrule


    【解决方案1】:

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

    如果值 UNTIL 指定的与指定的重复同步, 此 DATE 或 DATE-TIME 成为 复发。

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

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

    【讨论】:

      【解决方案2】:
      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 "";
          }
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多