Exchange 中的时区和 EWS

了解时区如何与 Exchange 中的 EWS 托管 API 和 EWS 配合使用。

大多数人未考虑过时区问题。 但是,使用 EWS 托管 API 或 EWS 指定日期和时间时,则是一个重要的概念。 在 EWS 托管 API 或 EWS 应用程序中处理时区不当,会产生意外结果。 只要了解操作方式,就可以轻松正确处理时区。

处理 EWS 托管 API 中的时区

如果你使用的是 EWS 托管 API,时区在大多数情况下会自动处理。 无需执行任何显式操作,API 将使用客户端计算机的本地时区,并在后台处理所有必要的转换。 如这是所期望的效果最好,但你还有其他选项。

即设置 ExchangeService.TimeZone 属性。 此属性控制 EWS 托管 API 执行的所有请求的时区。 此属性为只读状态;唯一设置方法是使用类构造函数。 如果使用 ExchangeService(System.TimeZoneInfo)ExchangeService(ExchangeVersion, System.TimeZoneInfo) 构造函数,则可以将特定时区指定为 System.TimeZoneInfo 对象。 如果使用不将 TimeZoneInfo 对象作为参数的其他其中一种构造函数,则 ExchangeService 类会将 TimeZone 属性设置为客户端计算机的当前时区。

无论是设置特定时区还是保留为客户端计算机的时区,所有日期和时间都以 TimeZone 所代表的时区来表示。 EWS 托管 API 将所有日期/时间属性公开为 System.DateTime 结构。 因此,如果设置任何日期/时间属性,请注意,指定的时间将根据 DateTime 对象上的 DateTime.Kind 属性值进行解释。 如果 Kind 属性的值设置为 Unspecified,则 DateTime 的值将解释为位于 TimeZone 属性指定的时区中。 如果要读取日期/时间属性,则所有 DateTime 属性均在该时区中表示。

如果要创建新约会或会议更新现有约会或会议,则可以替代 TimeZone 中为新的 约会 对象指定的时区。 但是,可以替代的内容完全取决于目标的EWS 架构版本。 对于 ExchangeService.RequestedServerVersion 属性的所有值,可以将 Appointment.StartTimeZone 设置为对此约会或会议使用特定时区。 如果 ExchangeService.RequestedServerVersion 属性使用值大于 Exchange2007_SP1,还可以设置 Appointment.EndTimeZone 属性,以便为 Appointment.End 属性指定时区。 但是,请记住,这些属性只影响创建请求的日期/时间的解释。 如果检索约会,开始时间和结束时间仍将以 TimeZone 属性指定的时区表示。

如果要更新现有约会或会议,可以通过设置 StartTimeZone 属性和/或 EndTimeZone 属性来更改 Appointment 对象的时区。 这样做将导致适用的时间做出相应的改变。 如果已将 ExchangeService.RequestedServerVersion 设置为 Exchange2007_SP1,则无法设置 EndTimeZone 属性;StartTimeZone 属性的值将用在此位置上。

表 1. EWS 托管 API 中的时区属性

时区属性 最低服务器请求版本 说明
TimeZone
Exchange2007_SP1
如果未通过 ExchangeService 类的构造函数设置,此属性将设置为客户端计算机的时区。 创建项目和检索现有项目时的所有 DateTime 属性都在此时区表示。 通过设置 Appointment.StartTimeZone 和/或 Appointment.EndTimeZone 属性,可以在创建约会和会议请求中覆盖此时区。 如果未由 Appointment.StartTimeZone 属性覆盖,则此时区将视为约会和会议的创建时区。
StartTimeZone
Exchange2007_SP1
如果对新的 Appointment 对象进行设置,则此时区用于解释 Appointment.StartAppointment.ReminderDueBy 属性。 此时区还将视为 Appointment 对象的创建时区。
检索现有项目时,此属性仅供参考。 现有约会的 DateTime 属性的值始终以 ExchangeService.TimeZone 属性指定的时区表示。
EndTimeZone
Exchange2010
如果对新的 Appointment 对象设置,则此时区用于解释 Appointment.End 属性。
检索现有项目时,此属性仅供参考。 现有约会的 DateTime 属性的值始终以 ExchangeService.TimeZone 属性指定的时区表示。

处理 EWS 中的时区

如果使用 EWS,则不会自动处理时区,并且情况会稍微复杂一些。 时区如何影响 EWS 请求和响应取决于许多因素:

dateTime 元素的值中指定的时区可以有三种形式。 你可以阅读 XML 架构第 2 部分:数据类型第二版中的所有详细信息,但要使用以下短语:

  • 世界协调时间(UTC): 由"Z"指定。 例如,2014-06-06T19:00:00.000Z

  • 特定时区: 由"+"或"-"指定,后跟小时和分钟。 例如,2014-06-06T19:00:00.000-08:00

  • 无时区:没有任何时区指定。 例如,2014-06-06T19:00:00.000

如果 dateTime 值(UTC 或特定时区)中有时区,则该值始终解释为该时区。 如果没有时区,则值的解释取决于其他时区相关元素的特定组合。

表 2. EWS 中的时区元素及其效果

RequestServerVersion 是否有 TimeZoneContext? 是否有 MeetingTimeZone、StartTimeZone 或 EndTimeZone(仅限 CalendarItem 和 MeetingRequest)? UTC 中的 dateTime 特定时区中的 dateTime 没有时区的 dateTime 约会和会议创建时区
Exchange2007_SP1

是 ( MeetingTimeZone )
解释为 UTC
解释为值中指示的时区
包含 MeetingTimeZone 元素的 CalendarItemMeetingRequest 元素中的元素解释为 MeetingTimeZone 元素中的时区,所有其他元素解释为 UTC
MeetingTimeZone 元素中的时区
Exchange2007_SP1


解释为 UTC
解释为值中指示的时区
解释为 UTC
UTC
Exchange2007_SP1

是 ( MeetingTimeZone )
解释为 UTC
解释为值中指示的时区
包含 MeetingTimeZone 元素的 CalendarItemMeetingRequest 元素中的元素解释为 MeetingTimeZone 元素中的时区,所有其他元素解释为 UTC
MeetingTimeZone 元素中的时区
Exchange2007_SP1


解释为 UTC
解释为值中指示的时区
解释为 UTC
UTC
Exchange2010 及更高版本

是(StartTimeZone 和/或 EndTimeZone
解释为 UTC
解释为值中指示的时区
如果有 StartTimeZone 元素,则 StartReminderDueBy 元素的值将解释为 startTimeZone 元素时区。 否则,这些元素的值将解释为 TimeZoneContext 元素中的时区。
如果有 EndTimeZone 元素,则 Start 元素的值将解释为 EndTimeZone 元素中的时区。 否则,End 元素的值将解释为 TimeZoneContext 元素中的时区。
CalendarItemMeetingRequest 之外的元素将解释为 TimeZoneContext 元素中的时区。
如果有则为 StartTimeZone 元素中的时区,如果没有则为 TimeZoneContext 元素中的时区
Exchange2010 及更高版本


解释为 UTC
解释为值中指示的时区
解释为 TimeZoneContext 元素中的时区
TimeZoneContext 元素中的时区
Exchange2010 及更高版本

是(StartTimeZone 和/或 EndTimeZone
解释为 UTC
解释为值中指示的时区
如果有 StartTimeZone 元素,则 StartReminderDueBy 元素的值将解释为 startTimeZone 元素时区。 否则,这些元素的值将解释为 UTC。
如果有 EndTimeZone 元素,则 Start 元素的值将解释为 EndTimeZone 元素中的时区。 否则,End 元素的值将解释为 UTC。
CalendarItemMeetingRequest 之外的元素将解释为 UTC。
如果有则为 StartTimeZone 元素的时区,否则为 UTC
Exchange2010 及更高版本


解释为 UTC
解释为值中指示的时区
解释为 UTC
UTC

在解释来自服务器的响应时,应始终检查每个元素的值并相应地解释该值。 Exchange 始终在值中包含时区(UTC 或特定时区)。

创建约会和会议时的其他时区注意事项

创建约会或会议时,适用于开始时间的时区将视为约会的创建时区。 除了控制创建约会或会议时如何解释日期/时间之外,创建时区对项目具有以下影响:

  • 如果项目是全天事件,则从使用不同于创建时区的客户端查看该项目时,它可能会以意外的方式显示。 这是因为创建全天事件时,全天事件的开始和结束时间将调整为创建时区的午夜时间。 该时间将显示为不同时区中除午夜以外的时间,因此该项目可能多显示出几天。 因此,建议尽可能使用为用户的主日历客户端配置的时区来创建全天事件。

  • 如果项目是会议,则创建时区将显示在 Outlook 信息栏中,显示与会者收到的会议请求(如果该时区不同于其客户端的时区)。

本节内容

另请参阅