Создание встречи в определенном часовом поясе с помощью EWS в Exchange
При создании встречи или собрания для календаря Exchange часовой пояс, используемый для указания времени начала и окончания, сохраняется как часовой пояс создания встречи. Этот часовой пояс также используется для интерпретации значений даты и времени, в которых не указан явный часовой пояс, поэтому важно понимать варианты указания часового пояса.
Создание встреч в разных часовых поясах с помощью управляемого API EWS
При создании встреч или собраний с помощью управляемого API EWS можно указать часовой пояс тремя способами:
Чтобы использовать часовой пояс компьютера, на котором выполняется управляемый API EWS, не указывайте часовой пояс при создании объекта ExchangeService .
Чтобы использовать определенный часовой пояс для всех свойств даты и времени, включая свойства при создании новой встречи или собрания, укажите часовой пояс в конструкторе объекта ExchangeService .
Чтобы использовать часовой пояс, отличный от указанного в свойстве ExchangeService.TimeZone , используйте свойства Appointment.StartTimeZone и Appointment.EndTimeZone .
Примечание.
Свойство EndTimeZone доступно только в том случае, если для свойства ExchangeService.RequestedServerVersion задано значение Exchange2010 или более поздней версии. Если он недоступен, параметр StartTimeZone применяется к времени начала и окончания встречи.
В следующем примере управляемый API EWS используется для создания трех встреч. Каждая встреча начинается в 13:00 через два дня, в неустановленном часовом поясе и заканчивается через час. Первая встреча создается в часовом поясе клиентского компьютера с использованием поведения управляемого API EWS по умолчанию. Второй объект создается в центральном часовом поясе с помощью свойств Appointment.StartTimeZone и Appointment.EndTimeZone . В этом случае мы также зададим для расширенного свойства TimeZoneDescription то же значение, что и для используемого часового пояса. Третий создается в часовом поясе Mountain с помощью свойства ExchangeService.TimeZone .
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, чтобы избежать проблемы с потенцией при отправке обновлений собрания входным получателям.
Если этот пример выполняется на клиентском компьютере, настроенном в восточном часовом поясе, а три встречи, которые он создает, просматриваются из клиента, настроенного в восточном часовом поясе, они отображаются в 13:00, 14:00 и 15:00 соответственно.
Создание встреч в разных часовых поясах с помощью EWS
При создании встреч или собраний с помощью EWS можно указать часовой пояс тремя способами:
Чтобы использовать универсальное координированное время (UTC), не включайте в запрос операции CreateItem элементы TimeZoneContext, MeetingTimeZone (только Exchange 2007) или StartTimeZone и EndTimeZone (Exchange 2010 и более поздних версий).
Чтобы использовать определенный часовой пояс для всех свойств даты и времени, включая свойства при создании новой встречи или собрания, укажите часовой пояс в элементе TimeZoneContext в запросе операции CreateItem .
Чтобы использовать часовой пояс, отличный от часового пояса, указанного в элементе TimeZoneContext , добавьте элемент TimeZoneContext , элемент MeetingTimeZone (только Exchange 2007) или элементы StartTimeZone и EndTimeZone (Exchange 2010 и более поздних версий) в запрос на операцию CreateItem .
В следующем примере запрос на операцию 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 для указания часового пояса Central для встречи. Обратите внимание, что элемент TimeZoneContext отсутствует. Однако при наличии значения элементов StartTimeZone и EndTimeZone переопределяют его значение. Опять же, значения элементов Start и End выражаются в формате UTC. Мы также задаем для расширенного свойства TimeZoneDescription то же значение, что и используемый часовой пояс.
<?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, просматриваются из клиента, настроенного в восточном часовом поясе, они отображаются в 13:00, 14:00 и 15:00 соответственно.
Теперь, когда вы знаете, как создавать встречи в определенных часовых поясах, вы можете обновить часовые пояса для существующих встреч до другого.