最近在做一个关于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. maven中使用dom4j解析、生成XML的简易方法

    此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...

  2. H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Romantic_Energy/article/details/50508332本文需要读者对H.26 ...

  3. 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析

    streams 轻便的gb28181协议中的rtp+ps格式视频流的封装和解析 packet packet实现ps的相关封装和解析, example/enc 通过joy4来读本地视频文件,然后调用Rt ...

  4. AOSP中的HLS协议解析

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...

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

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

  6. OS中atomic的实现解析

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

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

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

  8. Java中的static关键字解析

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

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

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

随机推荐

  1. 怎样实现了捕获应用中的日志在android开发中

    怎样实现了捕获应用中的日志在android开发中,大家可研究一下. Process mLogcatProc = null; BufferedReader reader = null; try { mL ...

  2. CXF和spring整合遇到的问题:No bean named 'cxf' is defined

    今天在做ws和spring整合的时候,很不幸的遇到了这个问题,百度了好久,竟然没人遇到这个问题,后来谷歌了一下,都是遇到这个问题的了...在看到一篇文章中提到了cxf.xml,所以我果断的打开这个配置 ...

  3. VS2010下安装Cocos2dx完整教程(原)

    一.本人所使用的Cocos2dx版本(cocos2d-2.1rc0-x-2.1.3),下载地址:http://code.google.com/p/cocos2d-x/downloads/list 当前 ...

  4. Scalaz(29)- Free :Coyoneda - Functor for free

    很多时候我们会遇到一些高阶类型F[_],但又无法实现它的map函数,也就是虽然形似但F不可能成为Functor.看看下面的例子: trait Interact[A] case class Ask(pr ...

  5. java中newInstance()和new()

    在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态 ...

  6. css知多少(3)——样式来源与层叠规则

    上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看看上一节. 这一节就开始实践上一节的思路! 1 ...

  7. Node.js Web 开发框架大全《中间件篇》

    这篇文章与大家分享优秀的 Node.js 中间件模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处 ...

  8. ASP.NET程序中常用的三十三种代码

    1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open(’*.aspx?id="+this.DropDown ...

  9. ABAP 锁机制

  10. javascript的浅拷贝和深拷贝

    1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据. 2.深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制. 这里画一个简单的图来加深理解: ...