首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 日曆事件設置每 3 天重複的 RRULE 正確寫法

     編輯:程式設計綜合問答

在 Android 中向日曆提供者添加事件時,使用 Events.RRULE 字段設置重複規則,需遵循 RFC 5545 (iCalendar) 標準格式。

問題代碼

values.put(Events.RRULE, "FREQ=WEEKLY;WKST=SU;BYDAY=SA"); // 每週六重複
// 需求:每 3 天重複一次

正確的 RRULE 寫法

// 每 3 天重複一次
values.put(Events.RRULE, "FREQ=DAILY;INTERVAL=3");

RRULE 核心參數解析

參數含義示例
FREQ頻率類型DAILY、WEEKLY、MONTHLY、YEARLY、SECONDLY、MINUTELY、HOURLY
INTERVAL間隔倍數INTERVAL=3 表示每 3 個 FREQ 單位
COUNT重複次數COUNT=10 表示重複 10 次後結束
UNTIL結束日期時間 (UTC)UNTIL=20231231T235959Z
BYDAY週幾 (周頻率用)BYDAY=MO,WE,FR (周一三五)
BYMONTHDAY月幾號 (月頻率用)BYMONTHDAY=1,15 (每月 1 號、15 號)
WKST週起始日WKST=MO (週一開始)

常見重複規則示例

// 每天重複
"FREQ=DAILY"

// 每 3 天重複 (本需求)
"FREQ=DAILY;INTERVAL=3"

// 每週一、三、五重複
"FREQ=WEEKLY;BYDAY=MO,WE,FR"

// 每月 1 號和 15 號重複
"FREQ=MONTHLY;BYMONTHDAY=1,15"

// 每年 12 月 25 日重複
"FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=25"

// 工作日重複 (排除週末)
"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"

// 重複 10 次後結束
"FREQ=DAILY;INTERVAL=3;COUNT=10"

// 直到 2024 年底結束
"FREQ=DAILY;INTERVAL=3;UNTIL=20241231T235959Z"

完整添加事件代碼

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();

long startMillis = System.currentTimeMillis(); // 現在開始
values.put(Events.DTSTART, startMillis);
values.put(Events.DURATION, "P1800S"); // 持續 30 分鐘 (ISO 8601)
values.put(Events.TITLE, "每 3 天提醒");
values.put(Events.DESCRIPTION, "定期檢查任務");
values.put(Events.CALENDAR_ID, calId); // 目標日曆 ID
values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
values.put(Events.RRULE, "FREQ=DAILY;INTERVAL=3"); // 核心:每 3 天

Uri uri = cr.insert(Events.CONTENT_URI, values);
long eventId = Long.parseLong(uri.getLastPathSegment());
Log.d("Calendar", "事件創建成功 ID: " + eventId);

注意事項

  • DTSTART 決定首次發生時間,重複基於此時間計算
  • DURATION 使用 ISO 8601 格式:PnYnMnDTnHnMnS (如 PT30M 30 分鐘,P1D 1 天)
  • 需 WRITE_CALENDAR 權限:<uses-permission android:name="android.permission.WRITE_CALENDAR" />
  • 部分國產 ROM 日曆提供者對 RRULE 支持不完整,建議測試驗證

現代替代:CalendarContract 封裝庫

使用第三方庫簡化操作,如 CalendarLib 或自行封裝 Builder 模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved