• 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/

  • 相关阅读:
    c++ range库
    差分数组
    简单比较一下C++中的引用和指针
    数字图像处理中一张常用图片
    内存池与内存块
    SmartPtr
    Allocator
    Java学习第12天
    Java学习第11天
    Java学习第10天
  • 原文地址:https://www.cnblogs.com/parryyang/p/5948436.html
Copyright © 2020-2023  润新知