加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 21:16:23 所属栏目:asp.Net 来源:网络整理
导读:最近在做一个关于Calendar的项目,相当于Google Calendar或者Outlook中的Calendar。在Calendar的发布和共享中,使用到了iCalendar,是一种日历数据交换的标准,具体参见维基百科: 由于使用C#开发,所以希望能够找到一个开源或者免费的iCalendar组件,帮助生

最近在做一个关于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();
            RecurrencePattern pattern =  RecurrencePattern();
            recurringComponent.RecurrenceRules.Add(pattern);
            recurringComponent.Start =  iCalDateTime(Convert.ToDateTime()); 
            var occurrences = recurringComponent.GetOccurrences(
                Convert.ToDateTime(),startTime <=endTime
                Convert.ToDateTime()); 
        <span class="kwrd"&gt;foreach</span> (Occurrence occurrence <span class="kwrd"&gt;in</span> occurrences)
        {
            DateTime occurrenceTime = occurrence.Period.StartTime.Local;
            Console.WriteLine(occurrenceTime.ToString(<span class="str"&gt;"yyyy-MM-dd"</span>));
        }</pre>

二、RRule的生成

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

代码如下:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读