ical4j 实现ICS文件的生成和解析

Posted 星星满天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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://工作台//[email protected]");
        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:[email protected]"));
             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文件的生成和解析的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 MPD 清单视频文件并获取图像适配集的片段?

程序 ICS4U - Lab 1难点解析

使用 WindowManager.addView 添加动态视图

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

使用 ffmpeg 生成单个 MPEG-Dash 片段

新版正方教务系统导出课程表-油猴脚本