O365 Calendar REST API v2.0 中的 OData 参数应如何处理开始和结束时区?

How should start and end timezone be handled in OData parameters in O365 Calendar REST API v2.0?

我想要达到的目标

我想获取用户日历中的所有事件,有时是在两个瞬间之间的特定 window 内,有时只是全部。这些事件必须在事件开始时立即排序。

我面临的问题

我在使用 OData v4 $filter$orderby 查询参数按事件的开始和结束进行过滤和排序时遇到了一些问题。问题在于,自 API 的 v2.0 起,这些属性是由 DateTimeTimeZone 组成的对象,并且 TimeZone 应在 filtering/ordering 由 DateTime.

这段摘自官方文档:

{
    "@odata.id": "https://outlook.office.com/api/beta/Users('ddfcd489-628b-40d7-b48b-57002df800e5@1717622f-1d94-4d0c-9d74-709fad664b77')/Events('AAMkAGI28tEyDAAA=')",
    "@odata.etag": "W/\"nfZyf7VcrEKLNoU37KWlkQAA/LpDWw==\"",
    "Id": "AAMkAGI28tEyDAAA=",
    "Subject": "Scrum",
    "Start": {
        "DateTime": "2015-11-02T17:00:00",
        "TimeZone": "Pacific Standard Time"
    },
    "End": {
        "DateTime": "2015-11-02T17:30:00",
        "TimeZone": "Pacific Standard Time"
    },
    ...
}

我可以过滤 Start/DateTimeEnd/DateTime,但 不考虑时区偏移量 Start/DateTime:

的排序也是如此
https://outlook.office365.com/api/v2.0/users/user@example.org/events/?$filter=End/DateTime%20gt%202016-12-11T00:00:00&$orderby=Start/DateTime

尝试仅按 Start 进行排序会导致错误,这告诉我无法对非原始属性进行排序。

无论我在创建事件时指定哪个时区,我在响应中收到的时区似乎都是 UTC。但是,文档显示 'Pacific Stardard Time',所以我可能不能假设所有事件都始终转换为 UTC。

为什么v1.0中没有这个问题API

在API的v1.0中,StartEnd仍然是(原始的)datetimeoffset,而StartTimeZoneEndTimeZone 是单独的属性,所以那个时候问题不存在。 StartEnd 包含一个偏移量,因此我可以过滤这些属性并按它们排序,同时忽略 StartTimeZoneEndTimeZone 属性。

使用 /calendarview 代替 /events

我知道 /calendarview 端点的存在,它允许我指定 window 来检索事件。但是,使用此端点还意味着我会收到事件的所有事件(我不感兴趣),而不是单个事件和系列大师。这就是我更喜欢使用常规 /events 端点的原因之一。

您可以传递首选时区 header 以在您想要的时区获得响应

Prefer: outlook.timezone="Eastern Standard Time"