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"));
}
目录
相关文章
|
3月前
|
数据采集 数据挖掘 API
跨境卖家必看:1688店铺订单列表,订单详情,订单物流接口详解
1688平台提供丰富的API接口,涵盖商品、订单、物流等核心业务场景。主要接口包括:**order.list**(查询订单列表)、**order.get**(获取订单详情)及**logistics.track**(查询物流信息),均支持GET请求方式,广泛应用于跨境寻源、数据采集、ERP系统等场景。
|
Prometheus Kubernetes 负载均衡
Opentelemetry collector用法
本文详细介绍了Opentelemetry Collector的使用方法及其各个组件(receiver、processor、exporter、connector和服务配置)的功能与配置。Collector的核心组件通过官方仓库提供丰富的实现,涵盖了认证、健康监控等功能。
1372 63
Opentelemetry collector用法
|
Shell
Shell 预定义变量 ($0、$$、$?、$#、$* 含义)
Shell 预定义变量 ($0、$$、$?、$#、$* 含义)
913 0
|
存储 Kubernetes 监控
91道常见的Kubernetes面试题总结
91道常见的Kubernetes面试题总结
657 2
91道常见的Kubernetes面试题总结
|
Kubernetes Cloud Native 容器
《深入浅出Kubernetes》电子版地址
《深入浅出Kubernetes》分为理论篇和实践篇,12篇技术文章帮你了解集群控制、集群伸缩原理、镜像拉取等理论,一次搞懂6个核心原理吃透基础理论,实现从基础概念的准确理解到上手实操的精准熟练,深入浅出使用Kubernetes!
60 0
《深入浅出Kubernetes》电子版地址
|
人工智能 弹性计算 监控
在云之上的猿辅导,撑住了500万中小学生的挑战
2020年1月,猿辅导正式对外宣布全球累计用户数量突破4亿,这家国内K-12在线教育领域首个独角兽公司,从猿题库、小猿搜题APP一路走来,如今已经成为拥有猿辅导(网课)、猿题库、小猿搜题、小猿口算、斑马AI课等多元化产品的在线教育企业,教学内容覆盖从学龄前、小学、初中到高中的完整K12阶段,用户涉及儿童、中小学生、家长和老师等各类人群。
2079 0
在云之上的猿辅导,撑住了500万中小学生的挑战
|
机器学习/深度学习 Shell Linux
linux LVM 一键分区脚本自动扩容
lv 分区,vg 卷,pv 硬盘;加s 列出,remove 删除 ;如:lvs和 lvremove 需要fdisk -l 查看LVM硬盘目录,如删除分区:lvremove /dev/mapper/eisc-b
2259 0
|
Go Linux
golang使用vet进行语法检查
golang vet工具的使用 一般来说每一门语言都有一些用来进行语法检查的工具,vet就是golang中提供的语法检查工具,可以让我检查出package或者源码文件中一些隐含的错误,规范我们的项目代码,下面我简单讲解下该工具的使用.
8376 0
|
10天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1216 5
|
9天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1181 87