Exchange 2010 Web服务 - 创建全天事件约会

时间:2011-10-19 22:08:33

标签: exchange-server exchangewebservices

我在使用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结束,并且是不是一整天。

可能是我做错了什么,但基于上面提到的以下问题:

  • EWS是否支持全天活动的格林威治时间? 如果是的话 - 可能是我的错误?

我感谢任何建议。 诚挚 安德鲁

4 个答案:

答案 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(阿姆斯特丹时间),则会显示超过两天的事件(并注意他的复选框为空白): Not exacty an all-day event

检查中的“全天”情况导致(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 +)。我有同样的问题,它帮助了我。