iCalendar格式中关于RRule的解析和生成

简介:

最近在做一个关于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"));
 }

二、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"));
}
目录
相关文章
|
1月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
|
3月前
|
JavaScript 前端开发 数据挖掘
node + ts 读取csv文件为二维数组
node + ts 读取csv文件为二维数组
27 0
|
3月前
复制和转换文件 - dd
【1月更文挑战第10天】
28 2
|
9月前
|
JavaScript 编译器 开发者
TS类型断言
TypeScript中的类型断言是一种将变量或表达式的类型强制转换为开发者指定的类型的方式。可以使用尖括号(<>)语法或者as语法进行类型断言。
|
索引
Ts中string、number和any等类型 不能当做索引用,怎么处理?
Ts中string、number和any等类型 不能当做索引用,怎么处理?
290 0
|
JavaScript
TS中的条件类型(ReturnType)
本偏介绍TS另一种高级类型-条件类型
196 0
|
SQL 前端开发 fastjson
使用 fastjson 转换 Date 格式的数据,默认是时间戳,更改为 年-月-日 的方法
使用 fastjson 转换 Date 格式的数据,默认是时间戳,更改为 年-月-日 的方法
816 0
TS之任意值
任意值(Any)用来表示允许赋值为任意类型。
175 0
ts函数讲解与不确定参数是否使用以及限制返回类型
ts函数讲解与不确定参数是否使用以及限制返回类型