65.9K
CodeProject 正在变化。 阅读更多。
Home

为您的程序添加 iCalendar 支持 - 第 1 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (22投票s)

2007年3月11日

BSD

3分钟阅读

viewsIcon

325061

downloadIcon

3305

本文介绍了如何使用 DDay.iCal 库在您的程序中加载和查看 iCalendar。

Screenshot - iCalendar_Part1.jpg

引言

本文介绍了如何使用 DDay.iCal 库加载和查看 iCalendar。我将在下一篇文章中介绍更高级的主题,例如创建、编辑和序列化 iCalendar。

在本文中,我将引导您创建一个控制台应用程序,该应用程序将加载并向用户显示即将发生的事件。我还包含了一个示例项目,演示了如何将这种支持添加到 ASP.NET Web 应用程序。

背景

许多程序员都在致力于向应用程序添加某种日历支持 - 从在网站上显示即将发生的事件到允许个性化的日历,并具有更改它们的能力。

因此,成千上万的程序员都在为其应用程序添加日历支持。那么,这有什么问题呢? 历史的答案是没有(或很少有)程序员遵循任何标准来实现他们的日历。 因此,如果您需要用日历完成原始应用程序不支持的任何其他操作,则必须手动编写。

此外,这些临时的日历只能从编写它们的应用程序中查看。 如果您想在日历中允许重复发生,以便事件可以“每月倒数第二个星期日”重复出现怎么办? 如果您想发布日历,以便其他人可以订阅它,并从他们喜欢的日历程序中查看它怎么办? 如果您想显示和操作来自多个来源的日历,包括您可能无法控制的来源怎么办?

这些是 iCalendar 标准为我们解决的一些问题。 如果您还不知道 - iCalendar 是 W3C 建议,也称为 RFC 5545。 您可以在这里找到它。

Using the Code

首先,打开 Visual Studio 并创建一个“Windows 控制台应用程序”项目。 然后,如果您尚未这样做,请从 SourceForge.net 下载最新二进制版本DDay.iCal。 完成后,您只需从您的项目中添加对 *DDay.iCal.dll* 的引用(即,从“项目”菜单中单击“添加引用”)。

然后,将以下内容添加到 *Program.cs* 文件的顶部

using DDay.iCal;

现在您可以加载您的第一个 iCalendar 了! 您可以通过多种方式加载 iCalendar,从简单地从本地文件系统加载文件,到从 WebDAV 或 CalDAV 存储加载,再到从数据库加载。 可能性是无限的;但是,在本文中,我们将重点介绍如何简单地从本地文件系统加载文件。 将以下代码添加到您的 Main() 方法中(当然,将路径替换为您的 *iCalendar* 文件的实际路径)。

// Load the calendar file
IICalendarCollection calendars = iCalendar.LoadFromFile(@"path\to\your\icalendar.ics");

恭喜,您已加载了 iCalendar,并准备好使用它了! 现在,让我们显示今天发生的事件

//
// Get all events that occur today.
//
IList&occurrence> occurrences = calendars.GetOccurrences
	(DateTime.Today, DateTime.Today.AddDays(1));

Console.WriteLine("Today's Events:");

// Iterate through each occurrence and display information about it
foreach (Occurrence occurrence in occurrences)
{
    DateTime occurrenceTime = occurrence.Period.StartTime.Local;
    IRecurringComponent rc = occurrence.Source as IRecurringComponent;
    if (rc != null)
        Console.WriteLine(rc.Summary + ": " + occurrenceTime.ToShortTimeString());
}

就这样! 需要明确的是,calendars.GetOccurrences(...) 返回一个 Occurrence 对象列表。 Occurrence 对象描述每次发生,包括发生日期/时间,以及对生成该发生的原始组件的引用。 我们将发生的 Source 转换为 IRecurringComponent,并显示其属性。

因此,现在我们已经显示了今天发生的所有事件。 让我们显示未来 7 天内将发生的所有即将发生的事件

//
// Get all occurrences for the next 7 days, starting tomorrow.
//
occurrences = calendars.GetOccurrences
		(DateTime.Today.AddDays(1), DateTime.Today.AddDays(7));

Console.WriteLine(Environment.NewLine + "Upcoming Events:");

// Start with tomorrow
foreach (Occurrence occurrence in occurrences)
{
    DateTime occurrenceTime = occurrence.Period.StartTime.Local;
    IRecurringComponent rc = occurrence.Source as IRecurringComponent;
    if (rc != null)
        Console.WriteLine(rc.Summary + ": " + occurrenceTime.ToString());
}

如您所见,此代码与“今天的事件”几乎相同,calendars.GetOccurrences(...) 略有不同。 这次我们还显示了重复出现的完整日期/时间。

注意:如果您只对某些类型的组件(即事件、待办事项等)感兴趣,那么您可以使用泛型版本的 GetOccurrences(即 calendars.GetOccurrences<IEvent>(...))来获取仅适用于这些事件的发生次数。

最终代码

这是 *Program.cs* 的最终结果

using System;
using System.Collections.Generic;
using System.Text;

// Required DDay.iCal namespace
using DDay.iCal;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Load the calendar file
            IICalendarCollection calendars = iCalendar.LoadFromFile(@"Business.ics");

            //
            // Get all events that occur today.
            //
            IList&occurrence> occurrences = calendars.GetOccurrences
				(DateTime.Today, DateTime.Today.AddDays(1));

            Console.WriteLine("Today's Events:");

            // Iterate through each occurrence and display information about it
            foreach (Occurrence occurrence in occurrences)
            {
                DateTime occurrenceTime = occurrence.Period.StartTime.Local;
                IRecurringComponent rc = occurrence.Source as IRecurringComponent;
                if (rc != null)
                    Console.WriteLine(rc.Summary + ": " + 
				occurrenceTime.ToShortTimeString());
            }

            //
            // Get all occurrences for the next 7 days, starting tomorrow.
            //
            occurrences = calendars.GetOccurrences
		(DateTime.Today.AddDays(1), DateTime.Today.AddDays(7));

            Console.WriteLine(Environment.NewLine + "Upcoming Events:");

            // Start with tomorrow
            foreach (Occurrence occurrence in occurrences)
            {
                DateTime occurrenceTime = occurrence.Period.StartTime.Local;
                IRecurringComponent rc = occurrence.Source as IRecurringComponent;
                if (rc != null)
                    Console.WriteLine(rc.Summary + ": " + occurrenceTime.ToString());
            }
        }
    }
}

关注点

有关更多信息,请访问 DDay.iCal 主页 ddaysoftware.com

非常抱歉,更新本文花了这么长时间。 我现在将提供更频繁的更新。

历史

  • 2010 年 4 月 14 日 - 更新到 1.0 Alpha 版本
  • 2007 年 3 月 9 日 - 发布
© . All rights reserved.