在 Exchange 中使用 EWS 在特定时区中创建约会
在 Exchange 日历上创建约会或会议时,用于指定开始时间和结束时间的时区将保存为约会的创建时区。 该时区还用于 解释未指定显式时区的日期和时间值,因此请务必了解指定时区的选项。
使用 EWS 托管 API 在不同时区创建约会
使用 EWS 托管 API 创建约会或会议时,有三个选项用于指定时区:
若要使用执行 EWS 托管 API 的计算机的时区,请不要在创建 ExchangeService 对象时指定时区。
若要对所有日期/时间属性(包括创建新约会或会议时的属性)使用特定时区,请在 ExchangeService 对象的构造函数中指定时区。
若要使用与 ExchangeService.TimeZone 属性中指定的时区不同的时区,请使用 Appointment.StartTimeZone 和 Appointment.EndTimeZone 属性。
注意
仅当 ExchangeService.RequestedServerVersion 属性设置为 Exchange2010 或更高版本时,EndTimeZone 属性才可用。 如果它不可用,设置 StartTimeZone 将同时应用于约会的开始时间和结束时间。
在以下示例中,EWS 托管 API 用于创建三个约会。 每个约会设置为从现在起两天的下午 1:00 开始,在未指定的时区,并在一小时后结束。 使用默认的 EWS 托管 API 行为在客户端计算机的时区中创建第一个约会。 第二个是在中部时区使用 Appointment.StartTimeZone 和 Appointment.EndTimeZone 属性创建的,在本例中,我们还将 TimeZoneDescription Extended 属性设置为与使用的 TimeZone 相同的值。 第三个是使用 ExchangeService.TimeZone 属性在 Mountain 时区中创建的。
using Microsoft.Exchange.WebServices.Data;
using System.Security;
static void CreateAppointments(string userEmail, SecureString userPass)
{
// *****************************************************
// Create an appointment using the client computer's time zone.
// *****************************************************
// Do not specify a time zone when creating the ExchangeService.
ExchangeService clientTZService = new ExchangeService(ExchangeVersion.Exchange2010);
clientTZService.Credentials = new NetworkCredential(userEmail, userPass);
clientTZService.AutodiscoverUrl(userEmail, redirectionCallback);
// Create the appointment.
Appointment clientTZAppt = new Appointment(clientTZService);
clientTZAppt.Subject = "Appointment created using client time zone";
clientTZAppt.Body = new MessageBody(string.Format("Time zone: {0}", clientTZService.TimeZone.DisplayName));
// Set the start time to 1:00 PM two days from today.
DateTime startTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day + 2);
startTime = startTime.AddHours(13);
clientTZAppt.Start = startTime;
// Set the end time to 2:00 PM on that same day.
DateTime endTime = startTime.AddHours(1);
clientTZAppt.End = endTime;
// Save the appointment to the default calendar.
try
{
// This method results in a call to EWS.
clientTZAppt.Save(SendInvitationsMode.SendToNone);
}
catch (Exception ex)
{
Console.WriteLine("Error saving appointment: {0}", ex.Message);
}
// *****************************************************
// Create an appointment in the Central time zone by
// using the StartTimeZone property.
// *****************************************************
// Extended Property for the TimeZone Description
ExtendedPropertyDefinition tzDescription = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, 33332, MapiPropertyType.String);
// Retrieve the Central time zone.
TimeZoneInfo centralTZ = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
// Create the appointment.
Appointment centralTZAppt = new Appointment(clientTZService);
centralTZAppt.Subject = "Appointment created using Central time zone";
centralTZAppt.Body = new MessageBody(string.Format("Time zone: {0}", centralTZ.DisplayName));
// Set the time zone on the appointment.
centralTZAppt.StartTimeZone = centralTZ;
centralTZAppt.EndTimeZone = centralTZ;
// Set the start time to 1:00 PM two days from today.
centralTZAppt.Start = startTime;
// Set the end time to 2:00 PM on that same day.
centralTZAppt.End = endTime;
// Set the TimeZone Description on the appointment/meeting
centralTZAppt.SetExtendedProperty(tzDescription, centralTZ.DisplayName);
// Save the appointment to the default calendar.
try
{
// This method results in a call to EWS.
centralTZAppt.Save(SendInvitationsMode.SendToNone);
}
catch (Exception ex)
{
Console.WriteLine("Error saving appointment: {0}", ex.Message);
}
// *****************************************************
// Create an appointment in the Mountain time zone by
// using the ExchangeService.TimeZone property.
// *****************************************************
// Specify the Mountain time zone when creating the ExchangeService.
TimeZoneInfo mountainTZ = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
ExchangeService mountainTZService = new ExchangeService(ExchangeVersion.Exchange2010, mountainTZ);
mountainTZService.Credentials = new NetworkCredential(userEmail, userPass);
mountainTZService.AutodiscoverUrl(userEmail, redirectionCallback);
// Create the appointment.
Appointment mountainTZAppt = new Appointment(mountainTZService);
mountainTZAppt.Subject = "Appointment created using Mountain time zone";
mountainTZAppt.Body = new MessageBody(string.Format("Time zone: {0}", mountainTZService.TimeZone.DisplayName));
// Set the start time to 1:00 PM two days from today.
mountainTZAppt.Start = startTime;
// Set the end time to 2:00 PM on that same day.
mountainTZAppt.End = endTime;
// Save the appointment to the default calendar.
try
{
// This method results in a call to EWS.
mountainTZAppt.Save(SendInvitationsMode.SendToNone);
}
catch (Exception ex)
{
Console.WriteLine("Error saving appointment: {0}", ex.Message);
}
}
注意
第二个示例中,需要设置 TimeZoneDescription 扩展属性,以避免在向输入收件人发送会议更新时出现强势问题。
在东部时区配置的客户端计算机上执行此示例时,从东部时区配置的客户端查看它创建的三个约会时,它们分别出现在下午 1:00、下午 2:00 和 3:00。
使用 EWS 在不同时区创建约会
使用 EWS 创建约会或会议时,有三个选项用于指定时区:
若要使用协调世界时 (UTC) ,请不要在 CreateItem 操作请求中包含 TimeZoneContext 元素、MeetingTimeZone 元素 (Exchange 2007 仅) 或 StartTimeZone 和 EndTimeZone 元素 (Exchange 2010 及更高版本) 。
若要对所有日期/时间属性(包括创建新约会或会议时的属性)使用特定时区,请在 CreateItem 操作请求的 TimeZoneContext 元素中指定时区。
若要使用与 TimeZoneContext 元素中指定的时区不同的时区,请在 CreateItem 操作请求中包含 TimeZoneContext 元素、MeetingTimeZone 元素 (Exchange 2007) 或 StartTimeZone 和 EndTimeZone 元素 (Exchange 2010 及更高版本) 。
以下示例 CreateItem 操作 请求使用 UTC 创建约会。 请注意, TimeZoneContext 元素、 StartTimeZone 元素和 EndTimeZone 元素不存在。 Start 和 End 元素值以 UTC 表示。
<?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
</soap:Header>
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToNone">
<m:Items>
<t:CalendarItem>
<t:Subject>Appointment created using UTC</t:Subject>
<t:Body BodyType="HTML">Time zone: UTC</t:Body>
<t:Start>2023-02-07T17:00:00.000Z</t:Start>
<t:End>2023-02-07T18:00:00.000Z</t:End>
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
以下示例 CreateItem 操作 请求使用 StartTimeZone 和 EndTimeZone 元素指定约会的中部时区。 请注意, TimeZoneContext 元素不存在。 但是,如果存在, 则 StartTimeZone 和 EndTimeZone 元素的值将替代其值。 同样, Start 和 End 元素值以 UTC 表示。 我们还将 TimeZoneDescription Extended 属性设置为与使用的 TimeZone 相同的值。
<?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
</soap:Header>
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToNone">
<m:Items>
<t:CalendarItem>
<t:Subject>Appointment created using Central time zone</t:Subject>
<t:Body BodyType="HTML">Time zone: (UTC-06:00) Central Time (US &amp; Canada)</t:Body>
<t:ExtendedProperty>
<t:ExtendedFieldURI DistinguishedPropertySetId="Appointment" PropertyId="33332" PropertyType="String" />
<t:Value>(UTC-06:00) Central Time (US & Canada)</t:Value>
</t:ExtendedProperty>
<t:Start>2023-02-07T18:00:00.000</t:Start>
<t:End>2023-02-07T19:00:00.000</t:End>
<t:StartTimeZone Id="Central Standard Time" />
<t:EndTimeZone Id="Central Standard Time" />
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
以下示例 CreateItem 操作 请求将 TimeZoneContext 元素设置为 Mountain 时区。 请注意, StartTimeZone 和 EndTimeZone 元素不存在。 Again, the Start and End element values are expressed in UTC.
<?xml version="1.0" encoding="utf-8"?>
<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"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Mountain Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToNone">
<m:Items>
<t:CalendarItem>
<t:Subject>Appointment created using Mountain time zone</t:Subject>
<t:Body BodyType="HTML">Time zone: (UTC-07:00) Mountain Time (US &amp; Canada)</t:Body>
<t:Start>2023-02-07T19:00:00.000</t:Start>
<t:End>2023-02-07T20:00:00.000</t:End>
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
从东部时区配置的客户端查看先前的 EWS 示例请求创建的三个约会时,它们分别在下午 1:00、下午 2:00 和 3:00 显示。
了解如何在特定时区创建约会后,可以将 现有约会上的时区更新 为其他时区。