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 起,这些属性是由 DateTime
和 TimeZone
组成的对象,并且 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/DateTime
和 End/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中,Start
和End
仍然是(原始的)datetimeoffset
,而StartTimeZone
和EndTimeZone
是单独的属性,所以那个时候问题不存在。 Start
和 End
包含一个偏移量,因此我可以过滤这些属性并按它们排序,同时忽略 StartTimeZone
和 EndTimeZone
属性。
使用 /calendarview 代替 /events
我知道 /calendarview
端点的存在,它允许我指定 window 来检索事件。但是,使用此端点还意味着我会收到事件的所有事件(我不感兴趣),而不是单个事件和系列大师。这就是我更喜欢使用常规 /events
端点的原因之一。
您可以传递首选时区 header 以在您想要的时区获得响应
Prefer: outlook.timezone="Eastern Standard Time"
我想要达到的目标
我想获取用户日历中的所有事件,有时是在两个瞬间之间的特定 window 内,有时只是全部。这些事件必须在事件开始时立即排序。
我面临的问题
我在使用 OData v4 $filter
和 $orderby
查询参数按事件的开始和结束进行过滤和排序时遇到了一些问题。问题在于,自 API 的 v2.0 起,这些属性是由 DateTime
和 TimeZone
组成的对象,并且 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/DateTime
和 End/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中,Start
和End
仍然是(原始的)datetimeoffset
,而StartTimeZone
和EndTimeZone
是单独的属性,所以那个时候问题不存在。 Start
和 End
包含一个偏移量,因此我可以过滤这些属性并按它们排序,同时忽略 StartTimeZone
和 EndTimeZone
属性。
使用 /calendarview 代替 /events
我知道 /calendarview
端点的存在,它允许我指定 window 来检索事件。但是,使用此端点还意味着我会收到事件的所有事件(我不感兴趣),而不是单个事件和系列大师。这就是我更喜欢使用常规 /events
端点的原因之一。
您可以传递首选时区 header 以在您想要的时区获得响应
Prefer: outlook.timezone="Eastern Standard Time"