Criar compromissos em um fuso horário específico usando o EWS no Exchange
Quando um compromisso ou reunião é criado em um calendário do Exchange, o fuso horário usado para especificar os horários de início e término é salvo como o fuso horário de criação para o compromisso. Esse fuso horário também é usado para interpretar valores de data e hora que não têm um fuso horário explícito especificado, portanto, é importante entender suas opções para especificar o fuso horário.
Criar compromissos em fusos horários diferentes usando a API Gerenciada do EWS
Ao criar compromissos ou reuniões usando a API Gerenciada do EWS, você tem três opções para especificar o fuso horário:
Para usar o fuso horário do computador em que sua API Gerenciada do EWS está sendo executada, não especifique um fuso horário ao criar o objeto ExchangeService .
Para usar um fuso horário específico para todas as propriedades de data/hora, incluindo propriedades ao criar um novo compromisso ou reunião, especifique um fuso horário no construtor para o objeto ExchangeService .
Para usar um fuso horário diferente do especificado na propriedade ExchangeService.TimeZone , use as propriedades Appointment.StartTimeZone e Appointment.EndTimeZone .
Observação
A propriedade EndTimeZone só está disponível quando a propriedade ExchangeService.RequestedServerVersion é definida como Exchange2010 ou posterior. Se ele não estiver disponível, a configuração do StartTimeZone se aplicará aos horários de início e de término do compromisso.
No exemplo a seguir, a API Gerenciada do EWS é usada para criar três compromissos. Cada compromisso está definido para começar às 13h daqui a dois dias, em um fuso horário não especificado e terminar uma hora depois. O primeiro compromisso é criado no fuso horário do computador cliente usando o comportamento padrão da API Gerenciada do EWS. O segundo é criado no fuso horário Central usando as propriedades Appointment.StartTimeZone e Appointment.EndTimeZone , nesse caso, também definimos a Propriedade Estendida TimeZoneDescription com o mesmo valor que o TimeZone que está sendo usado. O terceiro é criado no fuso horário de Montanha usando a propriedade 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);
}
}
Observação
No segundo exemplo, a Propriedade Estendida TimeZoneDescription precisa ser definida para evitar um problema de potencialização quando as atualizações de reunião estão sendo enviadas para o destinatário enternal.
Quando este exemplo é executado em um computador cliente configurado no fuso horário leste e os três compromissos que ele cria são exibidos de um cliente configurado no fuso horário leste, eles aparecem às 13h, 14h e 15h, respectivamente.
Criar compromissos em fusos horários diferentes usando o EWS
Ao criar compromissos ou reuniões usando o EWS, você tem três opções para especificar o fuso horário:
Para usar o UTC (Tempo Universal Coordenado), não inclua um elemento TimeZoneContext , elemento MeetingTimeZone (somente Exchange 2007) ou elementos StartTimeZone e EndTimeZone (Exchange 2010 e posterior) na solicitação de operação CreateItem .
Para usar um fuso horário específico para todas as propriedades de data/hora, incluindo propriedades ao criar um novo compromisso ou reunião, especifique um fuso horário no elemento TimeZoneContext na solicitação de operação CreateItem .
Para usar um fuso horário diferente do especificado no elemento TimeZoneContext , inclua um elemento TimeZoneContext , elemento MeetingTimeZone (somente Exchange 2007) ou elementos StartTimeZone e EndTimeZone (Exchange 2010 e posterior) na solicitação de operação CreateItem .
O exemplo a seguir , a solicitação de operação CreateItem cria um compromisso usando UTC. Observe que o elemento TimeZoneContext , o elemento StartTimeZone e o elemento EndTimeZone estão ausentes. Os valores do elemento Start e End são expressos em 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>
O exemplo a seguir , a solicitação de operação CreateItem usa os elementos StartTimeZone e EndTimeZone para especificar o fuso horário Central para o compromisso. Observe que o elemento TimeZoneContext está ausente. No entanto, se ele estivesse presente, os valores dos elementos StartTimeZone e EndTimeZone substituiriam seu valor. Novamente, os valores do elemento Iniciar e Terminar são expressos em UTC. Também definimos a Propriedade Estendida TimeZoneDescription como o mesmo valor que o TimeZone que está sendo usado.
<?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>
O exemplo a seguir , a solicitação de operação CreateItem define o elemento TimeZoneContext como o fuso horário de Montanha. Observe que os elementos StartTimeZone e EndTimeZone estão ausentes. 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>
Quando os três compromissos criados pelas solicitações de exemplo anteriores do EWS são exibidos de um cliente configurado no fuso horário oriental, eles aparecem às 13h, 14h e 15h, respectivamente.
Agora que você sabe como criar compromissos em fusos horários específicos, você pode atualizar os fusos horários em compromissos existentes para outro.