iCalendar 简介

iCalendar,简称“iCal”,是“日历数据交换”的标准(RFC 2445),该标准提供了一种公共的数据格式用于存储关于日历方面的信息,比如事件、约定、待办事项等。它不仅允许用户通过电子邮件发送会议或者待办事件等,也允许独立使用,而不局限于某种传输协议。

1、maven引入相关ical4j相关jar包:

在pom.xml中添加:

        <!-- ical4j begin-->
<dependency>
<groupId>org.mnode.ical4j</groupId>
<artifactId>ical4j</artifactId>
<version>1.0.2</version>
</dependency>
<!-- ical4j end-->

2、实现ICS文件的导入

/**
* 导入文件
*
* @throws ParserException
* @throws IOException
*/
@Test
public void importFile() throws IOException, ParserException { FileInputStream fis = new FileInputStream("D://工作台//18013093863@189.cn1.ics");
CalendarBuilder build = new CalendarBuilder();
Calendar calendar = build.build(fis);
for (Iterator i = calendar.getComponents(Component.VEVENT).iterator(); i.hasNext();) {
VEvent event = (VEvent) i.next();
// 开始时间
System.out.println("开始时间:" + event.getStartDate().getValue());
// 结束时间
System.out.println("结束时间:" + event.getEndDate().getValue());
if (null != event.getProperty("DTSTART")) {
ParameterList parameters = event.getProperty("DTSTART").getParameters();
if (null != parameters.getParameter("VALUE")) {
System.out.println(parameters.getParameter("VALUE").getValue());
}
}
// 主题
System.out.println("主题:" + event.getSummary().getValue());
// 地点
if (null != event.getLocation()) {
System.out.println("地点:" + event.getLocation().getValue());
}
// 描述
if (null != event.getDescription()) {
System.out.println("描述:" + event.getDescription().getValue());
}
// 创建时间
if (null != event.getCreated()) {
System.out.println("创建时间:" + event.getCreated().getValue());
}
// 最后修改时间
if (null != event.getLastModified()) {
System.out.println("最后修改时间:" + event.getLastModified().getValue());
}
// 重复规则
if (null != event.getProperty("RRULE")) {
System.out.println("RRULE:" + event.getProperty("RRULE").getValue());
}
// 提前多久提醒
for (Iterator alrams = event.getAlarms().iterator(); alrams.hasNext();) {
VAlarm alarm = (VAlarm) alrams.next();
Pattern p = Pattern.compile("[^0-9]");
String aheadTime = alarm.getTrigger().getValue();
Matcher m = p.matcher(aheadTime);
int timeTemp = Integer.valueOf(m.replaceAll("").trim());
if (aheadTime.endsWith("W")) {
System.out.println("提前多久:" + timeTemp + "周");
} else if (aheadTime.endsWith("D")) {
System.out.println("提前多久:" + timeTemp + "天");
} else if (aheadTime.endsWith("H")) {
System.out.println("提前多久:" + timeTemp + "小时");
} else if (aheadTime.endsWith("M")) {
System.out.println("提前多久:" + timeTemp + "分钟");
} else if (aheadTime.endsWith("S")) {
System.out.println("提前多久:" + timeTemp + "秒");
}
}
// 邀请人
if (null != event.getProperty("ATTENDEE")) {
ParameterList parameters = event.getProperty("ATTENDEE").getParameters();
System.out.println(event.getProperty("ATTENDEE").getValue().split(":")[1]);
System.out.println(parameters.getParameter("PARTSTAT").getValue());
}
System.out.println("----------------------------");
}
}

3、导出ICS文件

/**
* 导出文件
*/
@Test
public void exportFile() {
try {
// 创建一个时区(TimeZone)
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone timezone = registry.getTimeZone("Asia/Shanghai");
VTimeZone tz = timezone.getVTimeZone(); // 创建日历
Calendar calendar = new Calendar();
calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
calendar.getProperties().add(Version.VERSION_2_0);
calendar.getProperties().add(CalScale.GREGORIAN); // 时间主题
String summary = "重复事件测试";
// 开始时间
DateTime start = new DateTime(1478016000000l);
// 开始时间转换为UTC时间(UTC + 时区差 = 本地时间 )
start.setUtc(true);
// 结束时间
DateTime end = new DateTime(1478016000000l);
// 结束时间设置成UTC时间(UTC + 时区差 = 本地时间 )
end.setUtc(true);
// 新建普通事件
// VEvent event = new VEvent(start, end, summary);
// 定义全天事件(注意默认是UTC时间)
VEvent event = new VEvent(new Date(1478016000000l), new Date(1478016000000l), summary);
event.getProperties().add(new Location("南京堵路"));
// 生成唯一标示
event.getProperties().add(new Uid(new UidGenerator("iCal4j").generateUid().getValue()));
// 添加时区信息
event.getProperties().add(tz.getTimeZoneId());
// 添加邀请者
Attendee dev1 = new
Attendee(URI.create("mailto:dev1@mycompany.com"));
dev1.getParameters().add(Role.REQ_PARTICIPANT);
dev1.getParameters().add(new Cn("Developer 1"));
event.getProperties().add(dev1);
// 重复事件
Recur recur = new Recur(Recur.WEEKLY, Integer.MAX_VALUE);
recur.getDayList().add(WeekDay.MO);
recur.getDayList().add(WeekDay.TU);
recur.getDayList().add(WeekDay.WE);
recur.getDayList().add(WeekDay.TH);
recur.getDayList().add(WeekDay.FR);
RRule rule = new RRule(recur);
event.getProperties().add(rule);
// 提醒,提前10分钟
VAlarm valarm = new VAlarm(new Dur(0, 0, -10, 0));
valarm.getProperties().add(new Summary("Event Alarm"));
valarm.getProperties().add(Action.DISPLAY);
valarm.getProperties().add(new Description("Progress Meeting at 9:30am"));
// 将VAlarm加入VEvent
event.getAlarms().add(valarm);
// 添加事件
calendar.getComponents().add(event);
// 验证
calendar.validate();
FileOutputStream fout = new FileOutputStream("D://2.ics");
CalendarOutputter outputter = new CalendarOutputter();
outputter.output(calendar, fout);
} catch (Exception e) {
e.printStackTrace();
}
}

参考资源:

https://github.com/ical4j/ical4j/wiki/Examples

http://www.ibm.com/developerworks/cn/java/j-lo-ical4j/

ical4j 实现ICS文件的生成和解析的更多相关文章

  1. xml文件的生成与解析

    生成方法一:同事StringBuffer类对xml文件格式解析写入 package com.steel_rocky.xml; import android.app.Activity; import a ...

  2. dom4j生成和解析xml文件

    dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...

  3. NodeJs之word文件生成与解析

    NodeJs之word文件生成与解析 一,介绍与需求 1.1,介绍 1,officegen模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件.此模块不 ...

  4. Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  5. Android学习记录(1)—Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  6. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  7. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成

    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...

  8. [转]java二维码生成与解析代码实现

    转载地址:点击打开链接 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大 ...

  9. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

随机推荐

  1. GeoEvent使用问题及解决方法整理

    假如GeoEvent的部署环境是一个典型的WebGIS架构(Portal+GIS Server),往往会遇到一些问题,例如: 问题:发布的StreamService流服务无法查看. 原因:默认发布的S ...

  2. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q109-Q111)

    Question  109  Your company uses a third-party service to host its SharePoint 2010 site. The hosting ...

  3. 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装

    我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...

  4. 使用putty与SSHSecureShellClient登录远程服务器完成与本地Git项目的同步

    使用软件远程登录管理服务器 今天给大家介绍两款远程登录管理服务器的软件(Putty和SSHSecureShellClient),这两款也是我在工作中经常的软件. 使用 PuTTY 远程登录管理服务器 ...

  5. shell

    查看本机的shell有哪些 cat /etc/shells切换shell(zsh) chsh -s /bin/zsh 切换默认shell(bash) chsh -s /bin/bash  

  6. vim linux下查找显示^M并且删除

    linux下 ^M的输入方法是ctrl+v然后再ctrl+m vim下在文件中显示^M:e ++ff=unix % 在文件中删除^M:%s/^M$//g 在linux下查找^Mfind ./ | xa ...

  7. [AlwaysOn Availability Groups]AG扩展事件

    AG扩展事件 SQL Server 2012定义了一些关于AlwaysOn的扩展事件.你可以监控这些扩展事件来帮助诊断AG的根本问题.你也可以使用以下语句查看扩展事件: SELECT * FROM s ...

  8. 使用NetBeans、Eclipse阅读JDK源码

    下面说明在Netbeans.Eclipse环境下怎么查看JDK源码: Netbeans: 在"工具->java平台->源"里添加下路径,如果你安装jdk的时候选择安装了 ...

  9. hibernate 注解 唯一键约束 uniqueConstraints

    @Table 注解包含一个schema和一个catelog 属性,使用@UniqueConstraints 可以定义表的唯一约束. 如果是联合约束就用下面这种 @Table(name="tb ...

  10. Kibana+Logstash+Elasticsearch 日志查询系统

    搭建该平台的目的就是为了运维.研发很方便的进行日志的查询.Kibana一个免费的web壳:Logstash集成各种收集日志插件,还是一个比较优秀的正则切割日志工具:Elasticsearch一个开源的 ...