最近在做一个关于Calendar的项目,相当于Google Calendar或者Outlook中的Calendar。在Calendar的发布和共享中,使用到了iCalendar,是一种日历数据交换的标准,具体参见维基百科:http://zh.wikipedia.org/wiki/ICalendar

由于使用C#开发,所以希望能够找到一个开源或者免费的iCalendar组件,帮助生成.ics格式的文件。果然有人做了这样的事情,那就是DDay.iCal,开源地址:http://sourceforge.net/projects/dday-ical/

关于Calendar,普通的事件都好设置,最麻烦的就是循环事件。循环事件有多个属性需要设置,还要计算接下来发生的时间,但是在iCalendar标准中,这些循环设置,最终都化作为一个RRule格式的字符串(关于RRule格式的标准,我们可以参见http://www.kanzaki.com/docs/ical/rrule.html)。

既然是以DDay.iCal来生成ics文件,那么想必这个组件也有解析RRule格式和生成RRule格式的方法。下面就说说如果使用DDay.iCal处理RRule。

一、RRule的解析

DDay.iCal中有个RecurrencePattern对象,该对象可以用于描述循环设置。该对象在构造时可以传入RRule字符串,然后我们可以使用RecurringComponent对象的GetOccurrences方法获得循环事件在指定时间区间内的发生的时间。

闲话休说,我们看代码:

            RecurringComponent recurringComponent = new RecurringComponent();
            RecurrencePattern pattern = new RecurrencePattern("FREQ=WEEKLY;BYDAY=MO");//RRule设置为每周一发生
            recurringComponent.RecurrenceRules.Add(pattern);
            recurringComponent.Start = new iCalDateTime(Convert.ToDateTime("2013-6-1 00:00:00")); //该循环事件从6.1开始发生
            var occurrences = recurringComponent.GetOccurrences(
                Convert.ToDateTime("2013-6-30 23:59:59"),
                //我们虽然要取的是7.1号之后的事件,但是这里不能写成2013-7-1,因为该函数在计算时是>startTime <=endTime
                Convert.ToDateTime("2013-7-31 23:59:59")); //获得循环事件在7月份发生的具体时间

            foreach (Occurrence occurrence in occurrences)
            {
                DateTime occurrenceTime = occurrence.Period.StartTime.Local;
                Console.WriteLine(occurrenceTime.ToString("yyyy-MM-dd"));
            }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

二、RRule的生成

RRule还是通过RecurrencePattern来设置循环的属性,然后使用ToString方法就能够获得RRule字符串了。

代码如下:

RecurrencePattern pattern = new RecurrencePattern();
pattern.ByDay=new List<IWeekDay>(){new WeekDay(DayOfWeek.Sunday)};//每周周日发生
pattern.Frequency=FrequencyType.Weekly;//循环周期为周
Console.WriteLine(pattern.ToString());//生成RRule格式的字符串

RecurringComponent recurringComponent = new RecurringComponent();
recurringComponent.RecurrenceRules.Add(pattern);
recurringComponent.Start = new iCalDateTime(Convert.ToDateTime("2013-6-1 00:00:00")); //该循环事件从6.1开始发生
var occurrences = recurringComponent.GetOccurrences(
    Convert.ToDateTime("2013-6-30 23:59:59"),
    //我们虽然要取的是7.1号之后的事件,但是这里不能写成2013-7-1,因为该函数在计算时是>startTime <=endTime
    Convert.ToDateTime("2013-7-31 23:59:59")); //获得循环事件在7月份发生的具体时间

foreach (Occurrence occurrence in occurrences)
{
    DateTime occurrenceTime = occurrence.Period.StartTime.Local;
    Console.WriteLine(occurrenceTime.ToString("yyyy-MM-dd"));
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

iCalendar格式中关于RRule的解析和生成的更多相关文章

  1. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  2. OS中atomic的实现解析

    OS中atomic的实现解析 转自:http://my.oschina.net/majiage/blog/267409    摘要 atomic属性线程安全,会增加一定开销,但有些时候必须自定义ato ...

  3. AngularJS中的指令全面解析(转载)

    说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJ ...

  4. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  5. Java中的static关键字解析 转载

    原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...

  6. [JavaScript] JS中对Base64的解析

    JS中对Base64的解析 <script type="text/javascript"> /** * UTF16和UTF8转换对照表 * U+00000000 – U ...

  7. Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值

    感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...

  8. Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  9. ABP中动态WebAPI原理解析

    ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...

随机推荐

  1. SharedPreferences 的另一种场景的用法

    SharedPreferences 的另一种场景的用法 昨天,下班在家想做什么来着,然后想用SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用 ...

  2. 2-6 Working with Lambdas

    在C++中使用匿名函数,格式如下:[] () {}; Using a Lambda to Print array Values #include <algorithm> #include ...

  3. vue隐藏APP启动时显示的{{}}

    vue隐藏APP启动时显示的{{}} vue组件在编译好之前会显示{{msg}},在官网上找到这个

  4. OpenStack Austin 峰会观察:OpenStack as IaaS 已是过去,Solutions on OpenStack 才是未来

    虽然搞 OpenStack 前后也有几年,但是今年在美国 Austin 举办的 OpenStack Summit 我还是第一次参加.回来之后,一直还在回味,觉得要写点东西,将我在这次峰会上的观察和思考 ...

  5. Leetcode #28. Implement strStr()

    Brute Force算法,时间复杂度 O(mn) def strStr(haystack, needle): m = len(haystack) n = len(needle) if n == 0: ...

  6. CF 435B Pasha Maximizes(贪心)

    题目链接: [传送门][1] Pasha Maximizes time limit per test:1 second     memory limit per test:256 megabytes ...

  7. 【数据结构】建立和平衡AVL二叉树

    一步一步写平衡二叉树(AVL树) 原文地址:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 我添加了一些内容,以充实整个算 ...

  8. SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  9. Eclipse系列:如何断点调试web项目

    一直不知道如何在Eclipse中断点调试跟踪问题,今天试了一把,大致的步骤如下: 1)事先在需要断点跟踪的代码行左侧空白处双击处设置断点: 2)在工程列表中选中要调试的工程,然后点击Debug on ...

  10. overflow的劲爆知识点

    1.属性 visible(默认) hidden(此处是隐藏不是裁剪) scroll(滚动条) auto(智能路线 当超出范围时则出现滚动条) inherit 不常用  存在兼容性问题 2.进入CSS3 ...