[英]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.