【问题标题】:Exchange 2010 Web Services - creation of an all day event appointmentExchange 2010 Web 服务 - 创建全天活动约会
【发布时间】:2011-12-11 08:16:45
【问题描述】:

我在使用 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/2011 12AM 开始,到 10/21/2011 12AM 结束,并且只占用一天 - 10 月 /20/ 2011 年在 Outlook 日历中。

但是,如果约会对象的 isAllDayEvent 属性设置为 True(一切都保持不变) - 约会开始于 2011 年 10 月 19 日晚上 9:00:00,结束于 2011 年 10 月 21 日晚上 9:00:00,并且是不是整天。

这可能是我做错了什么,但基于上述为我提出的以下问题:

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

感谢任何建议。 真挚地 安德鲁

【问题讨论】:

    标签: exchange-server exchangewebservices


    【解决方案1】:

    您需要指定 MeetingTimeZone(对于 ES2007)或 StartTimeZone(对于 ES2010+)。我遇到了同样的问题,它帮助了我。

    【讨论】:

      【解决方案2】:

      我自己正在进行 DAV 到 EWS 的转换。我从Best Practices for Using Exchange Web Services for Calendaring Tasks (Ex 2007,但我认为适用于 Exchange 2010 和 2013)遇到的可能感兴趣的东西

      当 Exchange Web 服务接收到创建新 CalendarItem 的请求时,服务器必须将 Start 和 End 属性转换为协调世界时 (UTC),然后可以存储 CalendarItem。以下是转换为UTC的规则:

      如果请求通过 MeetingTimeZone 属性包含明确的时区定义,则服务器将根据时区定义的标准和夏令时规则应用正确的偏移量。

      如果未定义明确的时区,则将使用运行 Exchange 2007 的计算机(特别是正在处理请求的客户端访问服务器)的当前时区。

      注意: 在 Exchange 2007 SP1 中,所有未指定的时区都设置​​为 UTC,而不是客户端访问服务器的时区。

      尝试了一下,我发现如果你不指定时区,EWS 确实会将时间应用为 UTC。如果 IsAllDayEvent 为真,则开始时间和结束除了其日期组件外将被忽略。因此,在我的日历上,一整天的活动变成 12:00am-12:00am UTC 或 5:00pm-5:00pm(我也是 -7 UTC)。最佳实践文章建议使用 MeetingTimeZone 元素,但我收到一个错误,提示它已被折旧,请改用 StartTimeZone 和 EndTimeZone。确实添加 似乎有效。

      就您的 3 天问题而言,我能够重现类似的结果。这是我怀疑正在发生的事情。如果您告诉 Exchange 开始时间是早上 7 点,结束时间是早上 8 点,并标记一整天,它会自动将开始和结束时间设置为 yyy-mm-ddT00:00:00 和 yyy-mm-dd+ 1T00: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 中查看它时,它在 PST 中显示为 11 月 3 日下午 5 点至 11 月 6 日下午 5 点,看起来跨越 3 天(但实际上只有 48 小时)。

      【讨论】:

        【解决方案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>
        

        【讨论】:

          【解决方案4】:

          除了 Pete 的回答:
          请注意,Exchange 存储的内容与 Outlook 告诉您的内容有所不同。我正在向 Exchange 2010 Server 日历编写“纯”SOAP XML 调用,并通过 Outlook 2003 查看结果。创建调用明确指定 UTC 时间并且没有其他时区信息。服务器有 UTC 设置。
          如果我现在创建一个这样的全天活动:

            <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>
          

          如果 Outlook 还针对 UTC 进行了配置,这将显示为 1 月 8 日的全天事件(如预期的那样)。

          但是,如果我将 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>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-07
            • 2011-04-13
            • 1970-01-01
            • 2011-12-17
            相关资源
            最近更新 更多