使用Google Calendar API v3获取下一个重复活动的实例

时间:2013-01-25 12:47:32

标签: javascript google-calendar-api

我正在尝试将日历范围内的事件(单个或反复发生的事件)都记录下来。现在,我不一定知道下一个重复事件实例的确切日期时间。 对于重复发生的事件,我想要下一次出现的日期而不是第一个实例的日期,因为我得到了下面的请求。我该怎么做?

https://www.googleapis.com/calendar/v3/calendars/ {calendarid} /事件字段=项(ID,摘要,启动)及键= {APIkey}&安培; timeMax = {结束日期}&安培;时间min = {STARTDATE}

3 个答案:

答案 0 :(得分:9)

添加网址参数singleEvents=True。这会将所有重复活动扩展到各自的项目中。如果你还不知道它是什么时候没有任何方法专门获取系列中的第二个事件,但使用该参数将允许你解析所有实例并获得你想要的那个。

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

答案 1 :(得分: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");

答案 2 :(得分: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 = res.data.items[0]

类似地,如果您按降序排列结果并逆转时间界限(将timeMin设置为年份,并将timeMax设置为参考事件开始之前),则可以得到以前的实例。