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/
