搜索并获取某个时间范围内的约会

此示例会返回默认 Microsoft Outlook 日历中指定时间范围内的约会。

示例

此代码示例包含两个方法:DemoAppointmentsInRange 和 GetAppointmentsInRange。 DemoAppointmentsInRange 获取当前已登录 Outlook 配置文件的默认日历,设置从今天凌晨 12:00 开始的 5 天的日期范围,调用 GetAppointmentsInRange 以获取位于该时间范围内的约会,并显示每个返回约会的主题和开始时间。

GetAppointmentsInRange 会接受 Outlook 文件夹以及相应时间范围的开始和结束 DateTime 值作为输入参数。 此方法使用了 Restrict(String) 方法以及一种 Jet 格式字符串筛选器,该筛选器将返回在指定时间范围内开始并结束的约会。 假设 [Start] 和 [End] 是约会的开始时间和结束时间,而 startTime 和 endTime 是指定时间范围的开始和结束时间,则 GetAppointmentsInRange 设置一个筛选器,用于查找具有 [Start]>=startTime、 和 [End]<=endTime的约会。 以下代码显示了 C# 中的 Jet 筛选器。

string filter = "[Start] >= '"
    + startTime.ToString("g")
    + "' AND [End] <= '"
    + endTime.ToString("g") + "'";

在调用 Items.Restrict 方法来搜索约会之前,GetAppointmentsInRange 会执行另外两个操作来包含会在指定时间范围内发生的定期约会:

或者,如果你还对与指定时间范围的部分或全部时间重叠的约会感兴趣,则可以指定一种不同的筛选器来返回其他类型的约会(如图 1 所示):

  • 开始和结束时间均在指定时间范围内的约会(例如约会 A):

    [Start]>=startTime and [End]<=endTime

  • 开始时间早于指定时间范围,但结束时间在该时间范围内的约会(例如约会 B):

    [Start]<startTime and [End]<=endTime

  • 开始时间在指定时间范围内,但结束时间晚于该时间范围的约会(例如约会 C):

    [Start]>=startTime and [End]>endTime

  • 开始时间早于指定时间范围,且结束时间晚于该时间范围的约会(例如约会 D):

    [Start]<startTime and [End]>endTime

图 1. 在某个时间范围内的或与该时间范围重叠的约会的类型

在某个时间范围内的或与该时间范围重叠的约会的类型

在任何时间范围内,startTime<=endTime 这一条件都成立,因此具有 [Start]<=endTime[End]>=startTime 两个条件的筛选器将会捕捉该时间范围内的前述各种类型的约会。

在 C# 中,可以按如下所示表示 Jet 筛选器。

string filter = "[Start] <= '"
    + endTime.ToString("g")
    + "' AND [End] >= '"
    + startTime.ToString("g") + "'";

以下代码展示了完整的示例。 如果使用 Visual Studio 测试此代码示例,必须先添加对 Microsoft Outlook 15.0 对象库组件的引用,并在导入 Microsoft.Office.Interop.Outlook 命名空间时指定 Outlook 变量。 不得将 Importsusing 语句直接添加到此代码示例中的函数前面,这两个语句必须后跟公共类声明。 下面的代码行演示了如何在 Visual Basic 和 C# 中执行导入和分配。

Imports Outlook = Microsoft.Office.Interop.Outlook
using Outlook = Microsoft.Office.Interop.Outlook;
private void DemoAppointmentsInRange()
{
    Outlook.Folder calFolder =
        Application.Session.GetDefaultFolder(
        Outlook.OlDefaultFolders.olFolderCalendar)
        as Outlook.Folder;
    DateTime start = DateTime.Now;
    DateTime end = start.AddDays(5);
    Outlook.Items rangeAppts = GetAppointmentsInRange(calFolder, start, end);
    if (rangeAppts != null)
    {
        foreach (Outlook.AppointmentItem appt in rangeAppts)
        {
            Debug.WriteLine("Subject: " + appt.Subject 
                + " Start: " + appt.Start.ToString("g"));
        }
    }
}

/// <summary>
/// Get recurring appointments in date range.
/// </summary>
/// <param name="folder"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns>Outlook.Items</returns>
private Outlook.Items GetAppointmentsInRange(
    Outlook.Folder folder, DateTime startTime, DateTime endTime)
{
    string filter = "[Start] >= '"
        + startTime.ToString("g")
        + "' AND [End] <= '"
        + endTime.ToString("g") + "'";
    Debug.WriteLine(filter);
    try
    {
        Outlook.Items calItems = folder.Items;
        calItems.IncludeRecurrences = true;
        calItems.Sort("[Start]", Type.Missing);
        Outlook.Items restrictItems = calItems.Restrict(filter);
        if (restrictItems.Count > 0)
        {
            return restrictItems;
        }
        else
        {
            return null;
        }
    }
    catch { return null; }
}

另请参阅