我有一个应用程序,它使用Calendar v3 API来创建、查询和修改Google Calendar上的全天事件。当我创建这些事件时,它们看起来像这样:
{
summary: 'My Event",
start: { date: '2014-07-26' },
end: { date: '2014-07-26' }
}
因此,如果我想查询7月20日至7月26日之间的所有此类事件,我发送这样的查询:
GET www.googleapis.com/calendar/v3/{calendarID}/events?timeMin=2014-07-20T00%3A00%3A00.000Z&timeMax=2014-07-26T00%3A00%3A00.000Z
在更容易读的格式中,参数是:
timeMin:2014-07-20T00:00:00.000Z
timeMax:2014-07-26T00:00:00.000Z
但是,这排除了日期为2014-07-26
的所有事件,它只获得了20日到25日的事件。在我的参数中,您可以看到我使用setUTCHours(0)
是为了没有时区信息。
如果我为timeMin
和timeMax
参数删除对setUTCHours(0)
的调用,那么我就会遇到相反的问题,我得到7/21到7/26,并错过7/20的事件。我怎样才能可靠地获得一周中任何时区的所有全天事件?
这是我自己遇到的。结束时间为不包含,开始时间为包含。请参阅此处的事件规范。大概当您只指定日期而不指定时间时,它会将其视为UTC 00:00:00这样的东西——因此不包括当天。但这只是我的猜测。无论如何,如果你在结束日期前加1,它应该按照你期望的方式工作。
我会要求一周中两边都加1天,并对不感兴趣的事件进行后过滤。
问题是我如何创建事件。要创建日期为1
的全天事件,您应该将start
设置为x
,将end
设置为x + 1 day
。
var dateStringStart = dateToString(dateObj);
var dateObjEnd = new Date(dateObj.getTime() + (24 * 60 * 60 * 1000));
var dateStringEnd = dateToString(dateObjEnd);
gapi.client.request({
path: '/calendar/v3/calendars/' + id + '/events',
method: 'POST',
body: {
summary: name,
start: {
date: dateStringStart
},
end: {
date: dateStringEnd
}
},
callback: function(eventObj) {
// ...
}
});