在 Exchange 中使用 EWS 创建全天事件

了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 创建全天事件。

全天事件提供了一种表示一整天或多天(例如,假日或假期)发生的情况的方法。 使用 EWS 托管 API 或 EWS 创建全天事件是一种快速操作。 这就像 创建约会一样,但有一些小的更改。

设置开始和结束时间

根据定义,全天事件从特定日期的午夜开始, (24 小时结束,) 24 小时后结束。 但是,EWS 托管 API 和 EWS 允许在创建全天事件时指定除午夜以外的时间。 如果你不知道这些时间在服务器上是如何翻译的,这可能会导致意外行为。

当收到请求以在请求 或约会) 开始和/或结束时间的时区创建新的非午夜 (全天事件时,将根据以下规则将这些时间调整到相应时区的午夜:

  • 非午夜开始时间调整为指定时间之前的午夜。 例如,6 月 6 日下午 1:00 调整为 6 月 6 日凌晨 12:00。
  • 非午夜结束时间调整为指定时间后的午夜。 例如,6 月 6 日下午 1:00 调整为 6 月 7 日凌晨 12:00。

因此,你创建的全天事件始终包含你指定的开始和结束时间,但可能会要求在用户的日历上增加时间,因为将时间转移到午夜。 由于服务器会将开始和结束时间调整为午夜,因此建议在午夜指定开始时间和结束时间,以避免对时间进行任何意外更改。

创建全天事件时,还要考虑时区。 由于 Exchange 服务器在请求或约会的时区强制实施午夜开始和结束时间,因此在为不同时区配置的客户端中查看该全天事件可能会产生意外结果。 根据客户端的不同,它可能显示为一个全天事件,其中包含你不打算包含的额外天数,或者它可能不完全显示为全天事件。 因此,建议在创建全天事件时尽可能使用用户的首选时区。

使用 EWS 托管 API 创建全天事件

以下示例演示如何使用 EWS 托管 API 创建全天事件,该事件从 startDate 参数指定的日期开始,并持续 到 numDays 参数指定的天数。 请注意,约会将在 ExchangeService.TimeZone 属性指定的时区中创建。 此示例假定已在服务参数中传递的 ExchangeService 对象已使用凭据Url 属性的有效值进行初始化。

static void CreateAllDayAppointment(ExchangeService service, DateTime startDate, int numDays)
{
    // Best practice is to set the start date to midnight
    // on the first day of the all-day event.
    DateTime startDateMidnight = startDate.Date;
    // The end date should be midnight on the first day
    // after the event.
    DateTime endDateMidnight = startDateMidnight.AddDays(numDays);
    Appointment allDayEvent = new Appointment(service);
    // Set IsAllDayEvent to true.
    allDayEvent.IsAllDayEvent = true;
    // Set other properties.
    allDayEvent.Subject = "Vacation";
    allDayEvent.LegacyFreeBusyStatus = LegacyFreeBusyStatus.OOF;
    allDayEvent.Start = startDateMidnight;
    allDayEvent.End = endDateMidnight;
    // Save the appointment.
    try
    {
        allDayEvent.Save(WellKnownFolderName.Calendar, SendInvitationsMode.SendToNone);
        Console.WriteLine("All day event created.");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error saving all day event: {0}", ex.Message);
    }
}

使用 EWS 创建全天事件

以下示例演示创建全天事件的 EWS CreateItem 操作 请求。 约会在东部时区创建,如 TimeZoneContext 元素所示。 请注意, StartEnd 元素值的时间部分均为 04:00Z,在夏令时期间,这会将东部时区的午夜转换为午夜。

<?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="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:CreateItem SendMeetingInvitations="SendToNone">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="calendar" />
      </m:SavedItemFolderId>
      <m:Items>
        <t:CalendarItem>
          <t:Subject>Vacation</t:Subject>
          <t:Start>2014-06-09T04:00:00.000Z</t:Start>
          <t:End>2014-06-10T04:00:00.000Z</t:End>
          <t:IsAllDayEvent>true</t:IsAllDayEvent>
          <t:LegacyFreeBusyStatus>OOF</t:LegacyFreeBusyStatus>
        </t:CalendarItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

另请参阅 - Exchange 中的日历和 EWS