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.Start 和 Appointment.ReminderDueBy 属性。 此时区还将视为 Appointment 对象的创建时区。 检索现有项目时,此属性仅供参考。 现有约会的 DateTime 属性的值始终以 ExchangeService.TimeZone 属性指定的时区表示。 |
EndTimeZone |
Exchange2010 |
如果对新的 Appointment 对象设置,则此时区用于解释 Appointment.End 属性。 检索现有项目时,此属性仅供参考。 现有约会的 DateTime 属性的值始终以 ExchangeService.TimeZone 属性指定的时区表示。 |
处理 EWS 中的时区
如果使用 EWS,则不会自动处理时区,并且情况会稍微复杂一些。 时区如何影响 EWS 请求和响应取决于许多因素:
RequestServerVersion 元素中指定的 Exchange 版本
TimeZoneContext 元素中指定的时区 (如果有)
MeetingTimeZone、 StartTimeZone 或 EndTimeZone 元素(如果在约会或会议中有)中指定的时区
XML dateTime 中指定的时区元素(如果有)
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 元素的 CalendarItem 或 MeetingRequest 元素中的元素解释为 MeetingTimeZone 元素中的时区,所有其他元素解释为 UTC |
MeetingTimeZone 元素中的时区 |
Exchange2007_SP1 |
是 |
否 |
解释为 UTC |
解释为值中指示的时区 |
解释为 UTC |
UTC |
Exchange2007_SP1 |
否 |
是 ( MeetingTimeZone ) |
解释为 UTC |
解释为值中指示的时区 |
包含 MeetingTimeZone 元素的 CalendarItem 或 MeetingRequest 元素中的元素解释为 MeetingTimeZone 元素中的时区,所有其他元素解释为 UTC |
MeetingTimeZone 元素中的时区 |
Exchange2007_SP1 |
否 |
否 |
解释为 UTC |
解释为值中指示的时区 |
解释为 UTC |
UTC |
Exchange2010 及更高版本 |
是 |
是(StartTimeZone 和/或 EndTimeZone ) |
解释为 UTC |
解释为值中指示的时区 |
如果有 StartTimeZone 元素,则 Start 和 ReminderDueBy 元素的值将解释为 startTimeZone 元素时区。 否则,这些元素的值将解释为 TimeZoneContext 元素中的时区。 如果有 EndTimeZone 元素,则 Start 元素的值将解释为 EndTimeZone 元素中的时区。 否则,End 元素的值将解释为 TimeZoneContext 元素中的时区。 CalendarItem 或 MeetingRequest 之外的元素将解释为 TimeZoneContext 元素中的时区。 |
如果有则为 StartTimeZone 元素中的时区,如果没有则为 TimeZoneContext 元素中的时区 |
Exchange2010 及更高版本 |
是 |
否 |
解释为 UTC |
解释为值中指示的时区 |
解释为 TimeZoneContext 元素中的时区 |
TimeZoneContext 元素中的时区 |
Exchange2010 及更高版本 |
否 |
是(StartTimeZone 和/或 EndTimeZone ) |
解释为 UTC |
解释为值中指示的时区 |
如果有 StartTimeZone 元素,则 Start 和 ReminderDueBy 元素的值将解释为 startTimeZone 元素时区。 否则,这些元素的值将解释为 UTC。 如果有 EndTimeZone 元素,则 Start 元素的值将解释为 EndTimeZone 元素中的时区。 否则,End 元素的值将解释为 UTC。 CalendarItem 或 MeetingRequest 之外的元素将解释为 UTC。 |
如果有则为 StartTimeZone 元素的时区,否则为 UTC |
Exchange2010 及更高版本 |
否 |
否 |
解释为 UTC |
解释为值中指示的时区 |
解释为 UTC |
UTC |
在解释来自服务器的响应时,应始终检查每个元素的值并相应地解释该值。 Exchange 始终在值中包含时区(UTC 或特定时区)。
创建约会和会议时的其他时区注意事项
创建约会或会议时,适用于开始时间的时区将视为约会的创建时区。 除了控制创建约会或会议时如何解释日期/时间之外,创建时区对项目具有以下影响:
如果项目是全天事件,则从使用不同于创建时区的客户端查看该项目时,它可能会以意外的方式显示。 这是因为创建全天事件时,全天事件的开始和结束时间将调整为创建时区的午夜时间。 该时间将显示为不同时区中除午夜以外的时间,因此该项目可能多显示出几天。 因此,建议尽可能使用为用户的主日历客户端配置的时区来创建全天事件。
如果项目是会议,则创建时区将显示在 Outlook 信息栏中,显示与会者收到的会议请求(如果该时区不同于其客户端的时区)。