Обновление часового пояса встречи с помощью EWS в Exchange
Узнайте, как изменить часовой пояс для существующей встречи или собрания с помощью управляемого API EWS или EWS в Exchange.
При создании встречи или собрания для календаря Exchange часовой пояс, используемый для указания времени начала и окончания, сохраняется как часовой пояс создания встречи. Этот часовой пояс можно изменить с помощью EWS или управляемого API EWS. Тем не менее, изменение часового пояса приводит и к другим последствиям для времени начала и окончания встречи.
Значения времени хранятся на сервере Exchange Server в формате UTC. Таким образом, если встреча начинается в 13:00 по Восточному времени США (UTC-05:00), это значение сохраняется на сервере как 18:00, при условии что часовой пояс находится в стандартной фазе (зимнее время). При просмотре этой встречи в других часовых поясах соответствующее количество часов добавляется или вычитается из значения времени в формате UTC для определения конкретного времени. Например, если встреча начинается в 13:00 по Восточному времени США (18:00 UTC) и ее просматривает клиент из Тихоокеанского часового пояса (UTC-08:00), временем начала встречи для этого клиента будет 10:00 (18:00-08:00).
При изменении часового пояса встречи без обновления времени начала и окончания сервер обновляет значения в формате UTC, хранящиеся на сервере. Рассмотрим встречу, которая начинается в 13:00 по Восточному времени. Время хранится на сервере как 18:00 UTC. Если часовой пояс встречи изменяется на Тихоокеанский, сервер сдвигает время начала на 13:00 по Тихоокеанскому времени (21:00 UTC).
Это поведение можно изменить, явно задав время начала и окончания.
Обновление часового пояса существующей встречи с помощью управляемого API EWS
В приведенном ниже примере показано как, используя управляемый API EWS, изменить часовой пояс для имеющейся встречи на Центральный часовой пояс путем обновления свойств Appointment.StartTimeZone и Appointment.EndTimeZone. Если параметр shiftAppointnment имеет значение true, код явно не задает время начала и окончания встречи. В этом случае сервер сместит время начала и окончания относительно нового часового пояса таким образом, чтобы оно не изменилось в этом часовом поясе. Если задано значение false, код преобразует время начала и окончания явным образом, чтобы время встречи в формате UTC осталось неизменным.
В этом примере предполагается, что для объекта ExchangeService выполнена инициализация с допустимыми значениями в свойствах Credentials и 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);
}
Если пример используется для обновления встречи, которая начинается в 13:00 восточная часть и заканчивается в 14:00 восточная, при этом параметру shiftAppointment присвоено значение true, а свойству ExchangeService.TimeZone присвоено значение восточного часового пояса, выходные данные выглядят следующим образом.
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)
Если пример используется для обновления той же встречи с параметром shiftAppointment , заданным значением false, а для свойства TimeZone снова задано значение восточного часового пояса, выходные данные выглядят немного иначе.
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)
Обратите внимание, что время начала и окончания не было изменены. Это происходит потому, что время интерпретируются в Восточном часовом поясе (так как свойству TimeZone присвоен Восточный часовой пояс), а значения времени были обновлены, чтобы предотвратить сдвиг встречи.
Обновление часового пояса существующей встречи с помощью EWS
Следующий пример запроса UpdateItem Operation EWS обновляет часовой пояс встречи. В этом примере обновляются только элементы StartTimeZone и EndTimeZone, поэтому сервер будет сдвигать время начала и окончания встречи, чтобы сохранить то же относительное время в новом часовом поясе. Значение элемента ItemId укорочено для удобства чтения.
<?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>
Следующий пример запроса обновляет часовой пояс встречи, а также время начала и окончания, явно задавая элементы Start и End. Значение элемента ItemId укорочено для удобства чтения.
<?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>