按日期过滤 Outlook 日历 API 结果

Filtering Outlook Calendar API results by date

我正在使用 Node(特别是 node-outlook npm 模块)查看我的 Outlook.com 日历,基本请求正在运行。我正在从 API 返回结果,但我在使用 oData 请求参数时遇到问题,只能返回今天的结果。这是我得到的:

 var queryParams = {
    '$select': 'Subject,Start,End',
    '$orderby': 'Start/DateTime desc',
    //'$top': 10,
    'startDateTime': startDateString,
    'endDateTime': endDateString
    //'$filter': "Start/DateTime ge " + startDateString + " and Start/DateTime le " + endDateString

};

outlook.base.setApiEndpoint('https://outlook.office.com/api/v2.0');
outlook.base.setAnchorMailbox(<my email address>);
outlook.base.setPreferredTimeZone('Europe/London');

outlook.calendar.getEvents({token:token, odataParams: queryParams},function(error, result){
    //Do some stuff with the event data here
}

但是,如果我使用上面显示的参数(其中 startDateString 是 2016-10-28T00:00:00 并且 endDateString 是 2016-10-28T23:59:59),我仍然会返回过去和将来的事件。

这不是我想要的 - 我希望做的只是完成当前事件(因此尝试使用 oData $filter,但 API 没有它似乎不喜欢那样,它抱怨不兼容的二元运算符)。

任何人都可以建议我需要在参数中修改什么才能恢复今天安排的活动吗?

谢谢

编辑:这是我返回的示例:

StartDateTimeEndDateTime 属性表示为 DateTimeTimeZone 值创建或更新事件时值(包括时区信息):

"StartDateTime": {
   "DateTime": "2016-10-28T00:00:00",
   "TimeZone": "Europe/London" //current time zone
}  

正在转换为 UTC 值:

"StartDateTime": {
   "DateTime": "2016-10-27T23:00:00",  
   "TimeZone": "UTC" 
}  

过滤操作也是如此。这就是为什么 startDateStringendDateTime 值应该从本地时间转换为 UTC 以获得 今天 事件的原因。

例如,使用Moment.js library:

var startDateStringUtc = moment(startDateString).toISOString();
var endDateStringUtc= moment(endDateString).toISOString();

var queryParams = {
    '$select': 'Subject,Start,End',
    '$orderby': 'Start/DateTime desc',
    //'$top': 10,
    'startDateTime': startDateStringUtc,
    'endDateTime': endDateStringUtc
    //'$filter': "Start/DateTime ge " + startDateString + " and Start/DateTime le " + endDateString

};

关于DateTimeTimeZone结构

根据MSDN

Describes the date, time, and time zone of a point in time.

  • DateTime DateTime A single point of time in a combined date and time representation (T) according to ISO 8601 format.
  • TimeZone String One of the following time zone names.

如何确定事件创建时的时区

OriginalStartTimezone and OriginalEndTimezone are meant to reflect what timezone was set when the event was created or updated

想通了(或者至少对我来说

原来时间需要用引号引起来!

var queryParams = {
                '$orderby': 'Start/DateTime desc',
                '$filter': "Start/DateTime ge '" + startDateString + "' and Start/DateTime le '" + endDateString + "'"

            };

现在可以正常使用了。

哇哦!