我在使用Exchange 2010 Web服务(EWS)创建全天活动预约时遇到了麻烦。
根据创建全天活动的现有要求,约会对象需要具有指定的开始和结束时间(即10/20/2011 12:00:00 AM),以及时区。
但我的应用程序转换为使用EWS而不是WebDAV设置开始和结束时间转换为GMT(格林威治)时间,然后发送到Exchange服务器。
这种技术与WebDAV完美配合。 但是对于EWS,我得到了奇怪的结果:约会时间跨度为三(3)天,并且不是全天活动预约!!!
我的邮箱时区设置为太平洋标准时间(使用OWA界面),Exchange服务器日期和时间也设置为太平洋标准时间。
预约开始和结束时间分别设置为“2011-10-20T07:00:00.000Z”和“2011-10-21T07:00:00.000Z”。 就当地时间而言,这些时间分别为“10/20/2011 12:00:00 AM”和“10/21/2011 12:00:00 AM”(考虑夏令时)。
如果约会对象的IsAllDayEvent属性设置为False - 约会创建正确 - 而不是全天,从10月20日上午12点开始到12月21日上午12点结束,并且仅占用一天 - 10月/ 20 / 2011年在Outlook日历中。
但是如果约会对象的isAllDayEvent属性设置为True(其余部分保持不变) - 约会从2011年10月19日晚上9:00:00开始,到2011年10月21日晚9:00:00结束,并且是不是一整天。
可能是我做错了什么,但基于上面提到的以下问题:
我感谢任何建议。 诚挚 安德鲁
答案 0 :(得分:3)
遇到类似的问题,我的全天活动是从前一天下午4点到全天活动的指定日期的下午4点创建的(我目前处于太平洋标准时间-8所以似乎是一个UTC错误交换服务器端)。
调用Appointment.save
时,请使用可选的第二个参数SendInvitationsMode.SendToNone
,例如:
a.save(new FolderId(WellKnownFolderName.Calendar),
SendInvitationsMode.SendToNone);
如果您更喜欢XML,请参阅Envelope / Body / CreateItem / @ SendMeetingInvitations:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007"></t:RequestServerVersion>
</soap:Header>
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToNone">
<m:SavedItemFolderId>
<t:DistinguishedFolderId Id="calendar"></t:DistinguishedFolderId>
</m:SavedItemFolderId>
<m:Items>
<t:CalendarItem>
<t:Subject>From Java EWS</t:Subject>
<t:Body BodyType="HTML">the body</t:Body>
<t:Start>2014-01-03T00:00:00Z</t:Start>
<t:End>2014-01-04T00:00:00Z</t:End>
<t:IsAllDayEvent>true</t:IsAllDayEvent>
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
答案 1 :(得分:0)
我自己正在进行DAV到EWS的转换。我在Best Practices for Using Exchange Web Services for Calendaring Tasks遇到的一些可能感兴趣的内容(Ex 2007,但我认为适用于Exchange 2010和2013)
当Exchange Web服务收到创建新的CalendarItem的请求时,其开始和结束属性由非UTC偏移字符串标识,服务器必须将“开始”和“结束”属性转换为协调世界时(UTC)。可以存储CalendarItem。以下是转换为UTC的规则:
如果请求通过 MeetingTimeZone 属性包含显式时区定义,则服务器将根据时区定义的标准和日光规则应用正确的偏移量。
如果未定义显式时区,则将使用运行Exchange 2007的计算机的当前时区(特别是正在处理请求的客户端访问服务器)。
注意:的 在Exchange 2007 SP1中,所有未指定的时区都设置为UTC而不是客户端访问服务器的时区。
尝试一下,我发现如果你没有指定时区,EWS确实会将时间应用为UTC。如果IsAllDayEvent为true,则启动时间和结束将被忽略,除了它们的日期组件。因此,全天活动在我的日程表上变为UTC时间凌晨00:00-12:00或下午5:00 pm-5:00(我也是-7-UTC-UTC)。最佳实践文章建议使用MeetingTimeZone元素,但我收到一个错误,它已被折旧,请改用StartTimeZone和EndTimeZone。确实添加&lt; StartTimeZone Id =&#34; Pacific Standard Time&#34;&gt;似乎工作。
就你的3天问题而言,我能够重现类似的结果。这是我怀疑正在发生的事情。如果告诉Exchange开始时间是早上7点,结束时间是早上8点,并且整天标记,它会自动将开始和结束时间设置为yyy-mm-ddT00:00:00和yyy-mm- dd + 1 T00:00:00。因此,如果我在2011-11-04T07:00:00到2011-11-05T07:00:00之间预约时区元素,它会认为我试图跨越两天。开始时间2011-11-04T07:00:00成为2011-11-04T00:00:00至2011-11-05T00:00:00。结束时间2011-11-05T07:00:00变为2011-11-05T00:00:00至2011-11-06T00:00:00。这会以UTC身份在日历上抛出。在Outlook或webapp中查看时,它在太平洋标准时间显示为11月3日下午5点 - 11月6日下午5点,看起来像是跨越3天(但实际上只有48小时)。
答案 2 :(得分:0)
除了Pete的回答:
请注意,Exchange存储的内容与Outlook告诉您的内容之间存在差异。我正在编写“纯”SOAP XML调用到Exchange 2010 Server日历并通过Outlook 2003查看结果。创建调用显式指定UTC时间并且没有其他时区信息。服务器具有UTC设置
如果我现在创建一个像这样的allday事件:
<mes:CreateItem SendMeetingInvitations="SendToNone">
<mes:Items>
<typ:CalendarItem>
<typ:Subject>Alldayevent</typ:Subject>
<typ:Start>2013-01-08T01:00:00.000Z</typ:Start>
<typ:End>2013-01-08T02:00:00.000Z</typ:End>
<typ:IsAllDayEvent>true</typ:IsAllDayEvent>
... Exchange正确将其存储为(GetItem输出):
<t:Start>2013-01-08T00:00:00Z</t:Start>
<t:End>2013-01-09T00:00:00Z</t:End>
<t:IsAllDayEvent>true</t:IsAllDayEvent>
如果还为UTC配置了Outlook,则会显示为8月1日的全天事件(正如预期的那样)。
但是,如果我将Outlook设置为UTC + 1(阿姆斯特丹时间),则会显示超过两天的事件(并注意他的复选框为空白):
检查中的“全天”情况导致(GetItem输出):
<t:Start>2013-01-07T23:00:00Z</t:Start>
<t:End>2013-01-09T23:00:00Z</t:End>
<t:IsAllDayEvent>true</t:IsAllDayEvent>
答案 3 :(得分:0)
您需要指定MeetingTimeZone(适用于ES2007)或StartTimeZone(适用于ES2010 +)。我有同样的问题,它帮助了我。