簡體   English   中英

使用 Google Calendar API v3 獲取重復事件的下一個實例

[英]Get the next instance of recurring events with the Google Calendar API v3

我試圖在我的日歷中獲取某個日期范圍內的事件(單一事件或重復事件等)。 現在我不一定知道重復事件的下一個實例的確切日期時間為 . 對於重復發生的事件,我想要下一次發生的日期而不是第一次發生的日期,因為我收到了下面的請求。 我該怎么做呢?

https://www.googleapis.com/calendar/v3/calendars/ {calendarid}/events?fields=items(id,summary,start)&key={APIkey}&timeMax={enddate}&timeMin={startdate}

添加 URL 參數singleEvents=True 這會將所有重復發生的事件擴展到各自的項目中。 如果您還不知道它是什么時候,則沒有任何方法可以專門獲取系列中的第二個事件,但是使用該參數可以讓您解析所有實例並獲得您想要的實例。

來源: https : //developers.google.com/google-apps/calendar/v3/reference/events/list

long now = System.currentTimeMillis();

Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(eventsUriBuilder, Long.MIN_VALUE);
ContentUris.appendId(eventsUriBuilder, Long.MAX_VALUE);
String[] projection = new String[]{CalendarContract.Instances.CALENDAR_ID, CalendarContract.Instances.TITLE,
        CalendarContract.Instances.DESCRIPTION, CalendarContract.Instances.BEGIN,
        CalendarContract.Instances.END, CalendarContract.Instances.EVENT_LOCATION,
        CalendarContract.Instances.EVENT_ID};

Uri eventsUri = eventsUriBuilder.build();
Cursor instance_cursor = getActivity().getContentResolver().query(
        eventsUri, projection, CalendarContract.Instances.BEGIN + " >= " + now + " and " + CalendarContract.Instances.BEGIN
                + " <= " + (now + 2592000000L) + " and " + CalendarContract.Instances.VISIBLE + " = 1",
        null, CalendarContract.Instances.DTSTART + " ASC");

現在有直接的方法可以做到這一點,但您可以將一種方法組合在一起來實現。

這個想法是您可以指定時間邊界並限制記錄數量,這足以完成這項工作。

因此,將timeMin設置為現在(或在您的參考事件結束日期之后),將timeMax設置為足夠大的數字,例如從 timeMin 和maxResults = 1 算起的一年,如果它存在,將獲得下一個實例。

以下是在 nodejs 中如何做到這一點:

    let startDate = startTime ? new Date(startTime) : new Date()
    let endDate = endTime ? new Date(endTime) : new Date(startDate.getTime() + 12 * 31 * 24 * 60 * 60 * 1000) // 1 year ahead
    let startDateISO = startDate.toISOString()
    let endDateISO = endDate.toISOString()

    let result = await  calendar.events.instances({
        calendarId: "primary",
        eventId: masterEventId,
        maxResults: 1,
        timeMin: startDateISO,
        timeMax: endDateISO,
        orderBy: "startTime",
        timeZone: "UTC"
    })
    let nextInstance = res.data.items[0]

同樣,如果您按降序對結果進行排序並反轉時間邊界(將timeMin設置為一年前,將timeMax設置為參考事件開始之前),則您可以獲得前一個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM