Atualize o fuso horário para um compromisso usando o EWS no Exchange
Saiba como atualizar o fuso horário para um compromisso ou reunião existente usando a API Gerenciada do EWS ou 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. Você pode alterar esse fuso horário usando a API Gerenciada do EWS ou o EWS. No entanto, alterar o fuso horário em um compromisso tem outros efeitos na hora de início e término do compromisso.
Os valores de tempo são armazenados no servidor exchange em UtC (Coordinate Universal Time). Portanto, se um compromisso for definido para começar às 13:00 (13:00) no fuso horário oriental (UTC-05:00), esse valor será armazenado como 18:00 (18:00) no servidor, supondo que o fuso horário esteja em sua fase de horário padrão. Quando esse compromisso é exibido em outros fusos horários, o número apropriado de horas é adicionado ou subtraído do valor UTC para determinar o horário específico do fuso horário. Por exemplo, se um compromisso tiver uma hora de início às 13:00 leste (18:00 UTC), e for exibido de um cliente no fuso horário do Pacífico (UTC-08:00), o horário de início específico do fuso horário para esse cliente seria 10:00 (18:00 - 08:00).
Quando você atualiza o fuso horário do compromisso sem atualizar o horário de início e término, o servidor atualiza os valores UTC armazenados no servidor para manter a hora de início e término como os mesmos horários específicos do fuso horário. Por exemplo, considere o compromisso leste das 13:00. A hora é armazenada como 18:00 UTC no servidor. Se o fuso horário do compromisso for alterado para o fuso horário do Pacífico, o servidor mudará o horário de início para 13h no Pacífico (21:00 UTC).
Você pode alterar esse comportamento definindo explicitamente os horários de início e término.
Atualizando o fuso horário em um compromisso existente usando a API Gerenciada do EWS
No exemplo a seguir, a API Gerenciada do EWS é usada para atualizar o fuso horário em um compromisso existente para o fuso horário Central atualizando as propriedades Appointment.StartTimeZone e Appointment.EndTimeZone . Se o parâmetro shiftAppointnment for definido como true, o código não definirá explicitamente os horários de início e término no compromisso. Nesse caso, o servidor mudará os horários de início e término para mantê-los nos mesmos horários relativos ao fuso horário no novo fuso horário. Se definido como false, o código converterá os horários de início e término explicitamente para manter o compromisso ao mesmo tempo em UTC.
Este exemplo supõe que o objeto ExchangeService tenha sido inicializado com valores válidos nas propriedades Credentials e URL.
static void UpdateAppointmentTimeZone(ExchangeService service, ItemId apptId, bool shiftAppointment)
{
PropertySet includeTimeZones = new PropertySet(AppointmentSchema.Subject,
AppointmentSchema.Start,
AppointmentSchema.ReminderDueBy,
AppointmentSchema.End,
AppointmentSchema.StartTimeZone,
AppointmentSchema.EndTimeZone);
Appointment apptToUpdate;
// Load the existing appointment.
// This will result in a call to EWS.
try
{
apptToUpdate = Appointment.Bind(service, apptId, includeTimeZones);
}
catch (Exception ex)
{
Console.WriteLine("Error retrieving existing appointment: {0}", ex.Message);
return;
}
Console.WriteLine("Before update:");
// Output the current start, reminder, end, and time zones.
Console.WriteLine(" Start: {0}", apptToUpdate.Start);
Console.WriteLine(" Start time zone: {0}", apptToUpdate.StartTimeZone.DisplayName);
Console.WriteLine(" Reminder: {0}", apptToUpdate.ReminderDueBy);
Console.WriteLine(" End: {0}", apptToUpdate.End);
Console.WriteLine(" End time zone: {0}", apptToUpdate.EndTimeZone.DisplayName);
// Retrieve the Central time zone.
TimeZoneInfo centralTZ = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
// Update the time zones on the appointment.
apptToUpdate.StartTimeZone = centralTZ;
apptToUpdate.EndTimeZone = centralTZ;
if (!shiftAppointment)
{
// Set the start and end times explicitly so that the appointment
// will start and end at the same UTC time.
// Convert the times to then Central time zone. This
// will keep them at the same time in UTC.
// For example, 1:00 PM Eastern becomes 12:00 PM Central.
DateTime newStartTime = TimeZoneInfo.ConvertTime(
apptToUpdate.Start, centralTZ);
DateTime newEndTime = TimeZoneInfo.ConvertTime(
apptToUpdate.End, centralTZ);
apptToUpdate.Start = newStartTime;
apptToUpdate.End = newEndTime;
}
try
{
// Save the changes. This will result in a call to EWS.
apptToUpdate.Update(ConflictResolutionMode.AlwaysOverwrite,
SendInvitationsOrCancellationsMode.SendToNone);
}
catch (Exception ex)
{
Console.WriteLine("Error updating appointment: {0}", ex.Message);
return;
}
// Now rebind to the appointment to get the new values.
Appointment apptAfterUpdate;
try
{
// This will result in a call to EWS.
apptAfterUpdate = Appointment.Bind(service, apptId, includeTimeZones);
}
catch (Exception ex)
{
Console.WriteLine("Error retrieving existing appointment: {0}", ex.Message);
return;
}
Console.WriteLine("After update:");
// Output the current start, reminder, end, and time zones.
Console.WriteLine(" Start: {0}", apptAfterUpdate.Start);
Console.WriteLine(" Start time zone: {0}", apptAfterUpdate.StartTimeZone.DisplayName);
Console.WriteLine(" Reminder: {0}", apptAfterUpdate.ReminderDueBy);
Console.WriteLine(" End: {0}", apptAfterUpdate.End);
Console.WriteLine(" End time zone: {0}", apptAfterUpdate.EndTimeZone.DisplayName);
}
Quando o exemplo é usado para atualizar um compromisso que começa às 13:00 leste e termina às 14:00 leste, com o parâmetro shiftAppointment definido como true e a propriedade ExchangeService.TimeZone definida como o fuso horário oriental, a saída se parece com a seguinte.
Before update:
Start: 6/20/2014 1:00:00 PM
Start time zone: (UTC-05:00) Eastern Time (US & Canada)
Reminder: 6/20/2014 1:00:00 PM
End: 6/20/2014 2:00:00 PM
End time zone: (UTC-05:00) Eastern Time (US & Canada)
After update:
Start: 6/20/2014 2:00:00 PM
Start time zone: (UTC-06:00) Central Time (US & Canada)
Reminder: 6/20/2014 2:00:00 PM
End: 6/20/2014 3:00:00 PM
End time zone: (UTC-06:00) Central Time (US & Canada)
Quando o exemplo é usado para atualizar o mesmo compromisso com o parâmetro shiftAppointment definido como false e, com a propriedade TimeZone novamente definida como o fuso horário oriental, a saída parece um pouco diferente.
Before update:
Start: 6/20/2014 1:00:00 PM
Start time zone: (UTC-05:00) Eastern Time (US & Canada)
Reminder: 6/20/2014 1:00:00 PM
End: 6/20/2014 2:00:00 PM
End time zone: (UTC-05:00) Eastern Time (US & Canada)
After update:
Start: 6/20/2014 1:00:00 PM
Start time zone: (UTC-06:00) Central Time (US & Canada)
Reminder: 6/20/2014 1:00:00 PM
End: 6/20/2014 2:00:00 PM
End time zone: (UTC-06:00) Central Time (US & Canada)
Observe que os horários de início e término não foram alterados. Isso ocorre porque os horários estão sendo interpretados no fuso horário oriental (porque a propriedade TimeZone está definida como fuso horário leste) e os valores de tempo foram atualizados para impedir que o compromisso se deslocasse.
Atualizando o fuso horário em um compromisso existente usando o EWS
O exemplo a seguir, a solicitação de operação EWS UpdateItem atualiza o fuso horário em um compromisso. Este exemplo só atualiza os elementos StartTimeZone e EndTimeZone para que o servidor altere os horários de início e término do compromisso para mantê-lo no mesmo horário relativo ao fuso horário no novo fuso horário. O valor do elemento ItemId é abreviado para legibilidade.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
</soap:Header>
<soap:Body>
<m:UpdateItem ConflictResolution="AlwaysOverwrite" SendMeetingInvitationsOrCancellations="SendToNone">
<m:ItemChanges>
<t:ItemChange>
<t:ItemId Id="AAMkADA5..." ChangeKey="DwAAABYA..." />
<t:Updates>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:StartTimeZone" />
<t:CalendarItem>
<t:StartTimeZone Id="Central Standard Time" />
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:EndTimeZone" />
<t:CalendarItem>
<t:EndTimeZone Id="Central Standard Time" />
</t:CalendarItem>
</t:SetItemField>
</t:Updates>
</t:ItemChange>
</m:ItemChanges>
</m:UpdateItem>
</soap:Body>
</soap:Envelope>
A solicitação de exemplo a seguir atualiza o fuso horário do compromisso e também atualiza os horários de início e término definindo explicitamente os elementos Iniciar e Terminar . O valor do elemento ItemId é abreviado para legibilidade.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
</soap:Header>
<soap:Body>
<m:UpdateItem ConflictResolution="AlwaysOverwrite" SendMeetingInvitationsOrCancellations="SendToNone">
<m:ItemChanges>
<t:ItemChange>
<t:ItemId Id="AAMkADA5..." ChangeKey="DwAAABYA..." />
<t:Updates>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:StartTimeZone" />
<t:CalendarItem>
<t:StartTimeZone Id="Central Standard Time" />
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:EndTimeZone" />
<t:CalendarItem>
<t:EndTimeZone Id="Central Standard Time" />
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:Start" />
<t:CalendarItem>
<t:Start>2014-06-20T17:00:00.000Z</t:Start>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:End" />
<t:CalendarItem>
<t:End>2014-06-20T18:00:00.000Z</t:End>
</t:CalendarItem>
</t:SetItemField>
</t:Updates>
</t:ItemChange>
</m:ItemChanges>
</m:UpdateItem>
</soap:Body>
</soap:Envelope>