按日期过滤Outlook Calendar API结果

时间:2016-10-28 08:16:41

标签: node.js office365 outlook.com outlook-api

我正在使用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似乎并不喜欢它呻吟于不兼容的二元运算符。)

任何人都可以建议我需要在参数中修改我们今天的活动吗?

由于

编辑:以下是我收到的回复示例:enter image description here

2 个答案:

答案 0 :(得分:1)

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

  

描述某个时间点的日期,时间和时区。

     
      
  • DateTime DateTime 根据ISO 8601的组合日期和时间表示(T)中的单个时间点   格式。
  •   
  • TimeZone String 以下时区名称之一。
  •   

如何确定创建活动时的时区

  

OriginalStartTimezoneOriginalEndTimezone旨在反映出来   在创建或更新事件时设置了什么时区

答案 1 :(得分:1)

想出来(至少this SO question did it对我来说)

事实证明,时间需要用引号括起来!

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

            };

现在正在努力。

哎呀!