博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iCalendar格式中关于RRule的解析和生成
阅读量:6079 次
发布时间:2019-06-20

本文共 2346 字,大约阅读时间需要 7 分钟。

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

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

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

既然是以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
(){
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"));}

转载地址:http://rqqgx.baihongyu.com/

你可能感兴趣的文章
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>