Compartir a través de


Actualice la zona horaria de una cita mediante EWS en Exchange

Obtenga información sobre cómo actualizar la zona horaria de una cita o reunión existente mediante la API administrada de EWS o EWS en Exchange.

Cuando se crea una cita o reunión en un calendario de Exchange, la zona horaria que se usa para especificar las horas de inicio y finalización se guarda como zona horaria de creación para la cita. Puede cambiar esa zona horaria mediante la API administrada de EWS o EWS. Sin embargo, cambiar la zona horaria de una cita tiene otros efectos en la hora de inicio y finalización de la cita.

Los valores de hora se almacenan en el servidor de Exchange en la hora universal de coordenadas (UTC). Por lo tanto, si una cita está establecida para iniciarse a la 1:00 p.m. (13:00) en la zona horaria oriental (UTC-05:00), ese valor se almacena como 6:00 p.m. (18:00) en el servidor, suponiendo que la zona horaria se encuentra en su fase horaria estándar. Cuando esa cita se ve en otras zonas horarias, se agrega o resta el número adecuado de horas del valor UTC para determinar la hora específica de la zona horaria. Por ejemplo, si una cita tiene una hora de inicio a las 13:00 (18:00 UTC) y se ve desde un cliente en la zona horaria del Pacífico (UTC-08:00), la hora de inicio específica de la zona horaria para ese cliente sería de 10:00 a.m. (18:00 - 08:00).

Al actualizar la zona horaria de la cita sin actualizar la hora de inicio y finalización, el servidor actualiza los valores UTC almacenados en el servidor para mantener la hora de inicio y finalización como las mismas horas específicas de la zona horaria. Por ejemplo, considere la cita de la 1:00 p.m. este. La hora se almacena a las 18:00 UTC en el servidor. Si la zona horaria de la cita se cambia a la zona horaria del Pacífico, el servidor cambia la hora de inicio a la 1:00 p.m. (21:00 UTC).

Para cambiar este comportamiento, establezca explícitamente las horas de inicio y finalización.

Actualización de la zona horaria en una cita existente mediante la API administrada de EWS

En el ejemplo siguiente, la API administrada de EWS se usa para actualizar la zona horaria de una cita existente a la zona horaria central actualizando las propiedades Appointment.StartTimeZone y Appointment.EndTimeZone . Si el parámetro shiftAppointnment se establece en true, el código no establece explícitamente las horas de inicio y finalización en la cita. En este caso, el servidor desplazará las horas de inicio y finalización para mantenerlas en las mismas horas horarias relativas a la zona horaria en la nueva zona horaria. Si se establece en false, el código convierte las horas de inicio y finalización explícitamente para mantener la cita al mismo tiempo en UTC.

En este ejemplo se asume que el objeto ExchangeService se ha inicializado con valores válidos en las propiedades Credentials y 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);
}

Cuando el ejemplo se usa para actualizar una cita que comienza a la 1:00 p.m. en el este y termina a las 2:00 p.m. este, con el parámetro shiftAppointment establecido en true y la propiedad ExchangeService.TimeZone establecida en la zona horaria oriental, la salida es similar a la siguiente.

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)

Cuando se usa el ejemplo para actualizar la misma cita con el parámetro shiftAppointment establecido en false y con la propiedad TimeZone de nuevo establecida en la zona horaria oriental, la salida tiene un aspecto un poco 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 las horas de inicio y finalización no cambiaron. Esto se debe a que las horas se interpretan en la zona horaria oriental (porque la propiedad TimeZone está establecida en la zona horaria oriental) y los valores de hora se actualizaron para evitar que la cita se desplace.

Actualización de la zona horaria en una cita existente mediante EWS

En el ejemplo siguiente, la solicitud de operación UpdateItem de EWS actualiza la zona horaria en una cita. En este ejemplo solo se actualizan los elementos StartTimeZone y EndTimeZone , por lo que el servidor desplazará las horas de inicio y finalización de la cita para mantenerla en la misma hora relativa a la zona horaria en la nueva zona horaria. El valor del elemento ItemId se acorta para mejorar la legibilidad.

<?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>

En la solicitud de ejemplo siguiente se actualiza la zona horaria de la cita y también se actualizan las horas de inicio y finalización estableciendo explícitamente los elementos Start y End . El valor del elemento ItemId se acorta para mejorar la legibilidad.

<?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>

Vea también