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/

posted @ 2016-10-11 10:52  星星满天  阅读(8862)  评论(0编辑  收藏  举报