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/