Office 365 API为整天事件返回错误的开始和结束日期时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Office 365 API为整天事件返回错误的开始和结束日期时间相关的知识,希望对你有一定的参考价值。
以下是重现错误的步骤:
- 检查Office 365中的时区设置,我的设置为美国东部,所以现在是5小时的偏移:http://take.ms/2qwxJ
- 创建一个全天活动:http://take.ms/tRWSf
- 通过在周视图中查看事件并观察其与其他日期不重叠,确认事件在您的时区中的上午12点至中午12点开始和结束。我还确认,通过在与Office 365帐户同步的桌面Outlook客户端中查看它,可以按预期保存整天事件。在那里,您可以看到事件的时区是正确的(EST)。
- 通过calendarview api端点查看事件。请注意,它将时区显示为UTC,并将开始和结束时间报告为午夜至午夜UTC。
{
"@odata.context":"https://outlook.office.com/api/v1.0/$metadata#Me/CalendarView",
"value":[
{
"@odata.id":"NOT IMPORTANT",
"@odata.etag":"NOT IMPORTANT",
"Id":"NOT IMPORTANT",
"DateTimeCreated":"2016-01-20T20:48:49.3867149Z",
"DateTimeLastModified":"2016-01-20T20:48:49.4179638Z",
"ChangeKey":"NOT IMPORTANT",
"Categories":[
],
"StartTimeZone":"UTC",
"EndTimeZone":"UTC",
"ResponseStatus":{
"Response":"Organizer",
"Time":"0001-01-01T00:00:00Z"
},
"iCalUId":"NOT IMPORTANT",
"Reminder":null,
"HasAttachments":false,
"Subject":"My all day event, in EST",
"Body":{
"ContentType":"html",
"Content":"<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="">
<!--
p
{margin-top:0;
margin-bottom:0}
-->
</style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt; color:#000000; background-color:#FFFFFF; font-family:Calibri,Arial,Helvetica,sans-serif">
<p><br>
</p>
</div>
</body>
</html>
"
},
"BodyPreview":"",
"Importance":"Normal",
"Sensitivity":"Normal",
"Start":"2016-01-26T00:00:00Z",
"End":"2016-01-27T00:00:00Z",
"Location":{
"DisplayName":""
},
"IsAllDay":true,
"IsCancelled":false,
"IsOrganizer":true,
"Recurrence":null,
"ResponseRequested":true,
"SeriesMasterId":null,
"ShowAs":"Busy",
"Type":"SingleInstance",
"Attendees":[
],
"Organizer":{
"EmailAddress":{
"Name":"brett",
"Address":"NOT IMPORTANT"
}
},
"WebLink":"NOT IMPORTANT"
}
]
}
我希望东部标准时间的开始和结束时间准确到当天的开始和结束时间
"Start":"2016-01-26T05:00:00Z",
"End":"2016-01-27T05:00:00Z",
答案
在任何时区,全天活动均为午夜至午夜。 UTC没有任何不同。
另一答案
您也可以轻松地从v1 API获取数据,您只需要确保按时要求传递UTC
时区并获取信息,您需要指定您期望的时区。
$date = new DateTime("now", new DateTimeZone('UTC') );
$deviceTimeStart = $date->format('Y-m-dTH:i:s');
$deviceTimeEndPlus1 = $date->modify('+1 minutes');
$deviceTimeEnd = $deviceTimeEndPlus1->format('Y-m-dTH:i:s');
$httpHeader = array(
"authorization: Bearer *****access_token*****",
"cache-control: no-cache",
"Prefer : outlook.timezone = "Asia/Kolkata""
);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://graph.microsoft.com/v1.0/me/calendarview?startDateTime='.$TimeStart.'&endDateTime='.$TimeEnd.'&$select=Subject,Organizer,Start,End,bodyPreview,changeKey,location,attendees,organizer,lastModifiedDateTime',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => $httpHeader,
)
);
$curlResponse = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
$responseNew = (array) json_decode($curlResponse, true);
以上是关于Office 365 API为整天事件返回错误的开始和结束日期时间的主要内容,如果未能解决你的问题,请参考以下文章
使用 EWS 和 OAuth 2 的 Office 365 日历 API