4

我试图在我的日历中获取某个日期范围内的事件(单个或重复事件)。现在我不一定知道下一个重复事件实例的确切日期时间为 . 对于重复发生的事件,我想要下一次发生的日期而不是第一次发生的日期,因为我收到了下面的请求。我该怎么做呢?

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

4

3 回答 3

10

添加 URL 参数singleEvents=True。这会将所有重复发生的事件扩展到它们的单个项目中。如果您还不知道它是什么时候,则没有任何方法可以专门获取系列中的第二个事件,但是使用该参数可以让您解析所有实例并获得您想要的那个。

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

于 2013-01-25T19:37:25.083 回答
0
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");
于 2017-08-18T03:28:57.017 回答
0

现在有直接的方法可以做到这一点,但您可以组合一种方法来实现这一点。

这个想法是您可以指定时间边界并限制记录数量,这足以完成这项工作。

因此,将设置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 = result.data.items[0]

timeMin同样,如果您按降序排列结果并反转时间边界(设置为一年前和timeMax参考事件开始之前),您可以获得前一个实例。

于 2020-05-18T13:01:29.357 回答