ical4j 實現ICS文件的生成和解析


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM