【问题标题】:Java, ICS calendar format not showing time when imported in Outlook or ThunderbirdJava、ICS 日历格式在 Outlook 或 Thunderbird 中导入时不显示时间
【发布时间】:2015-09-11 14:42:11
【问题描述】:

我正在处理一个 Java 项目,在该项目中我正在创建一个 ICS 文件,但日期和时间有问题。每当我导入 ICS 文件时,我想在 ICS 文件中显示事件的开始时间和事件的结束时间。

我尝试使用包含 endTime 的构造函数,但运气不好,仍然显示 00:00。下面的代码我用来生成 ICS 文件,下面是 ICS 文件的内容。

代码:

 Calendar icsCalendar = new Calendar();
            icsCalendar.getProperties().add(Version.VERSION_2_0);
            icsCalendar.getProperties().add(CalScale.GREGORIAN);

            String startDateString = new SimpleDateFormat("yyyyMMdd'T'hhmmss'Z'").format(groupNotes.getStartTimestamp());
            String endDateString = new SimpleDateFormat("yyyyMMdd'T'hhmmss'Z'").format(groupNotes.getEndTimestamp());
            net.fortuna.ical4j.model.Date startDt = null;
            net.fortuna.ical4j.model.Date endDateFortuna = null;
            try {
                startDt = new net.fortuna.ical4j.model.Date(startDateString, "yyyyMMdd'T'hhmmss'Z'");
                endDateFortuna = new net.fortuna.ical4j.model.Date(endDateString, "yyyyMMdd'T'hhmmss'Z'");
            } catch (ParseException e) {
                e.printStackTrace();
            }

            java.util.Calendar endDate = java.util.Calendar.getInstance();
            endDate.setTimeInMillis(groupNotes.getEndTimestamp().getTime());
           /* long difference = groupNotes.getEndTimestamp().getTime() - groupNotes.getStartTimestamp().getTime();
            int min = (int) (difference / (1000 * 60));
            Dur dur = new Dur(0, 0, min, 0);*/
            VEvent vEvent = new VEvent(startDt, endDateFortuna, groupNotes.getMnotetag());
            vEvent.getProperties().add(new Description());
            try {
                vEvent.getProperties().getProperty(Property.DESCRIPTION).setValue(groupNotes.getMnotetext());
                vEvent.getProperties().add(new Organizer("MAILTO:" + groupNotes.getNoteCreatorEmail()));

            } catch (IOException | URISyntaxException | ParseException e) {
                e.printStackTrace();
            }
            icsCalendar.getComponents().add(vEvent);

            FileOutputStream fout = null;

            try {
                fout = new FileOutputStream(calFile);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            CalendarOutputter outputter = new CalendarOutputter();
            outputter.setValidating(false);

            try {
                outputter.output(icsCalendar, fout);
                return new FileInputStream("mycalendar.ics");
            } catch (IOException | ValidationException e) {
                e.printStackTrace();
            }
        }

这是我的 ICS 文件的样子:

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20150910T152828Z
DTSTART;VALUE=DATE:20150911
DTEND;VALUE=DATE:20150911
SUMMARY:
DESCRIPTION:poip
ORGANIZER:MAILTO:email@gmail.com
END:VEVENT
END:VCALENDAR

现在,当我导入它时,Outlook、thunderbird 或 Evolution 中没有提到时间。我究竟做错了什么?谢谢你。

【问题讨论】:

    标签: java time outlook icalendar rfc5545


    【解决方案1】:

    您仅为VEVENTDTSTARTDTEND 属性指定DATE 而不是DATE-TIME

    注意:它们是 Date-Time Start 和 Date-Time End 的缩写。

    有关更多详细信息,您可以参考 RFC5545,特别是 DATE-TIME、或 DTSTARTVEVENT

    第二个,也会提醒你DTSTART的默认是DATE-TIME格式而不是DATE格式。

    第三个表示DTSTART 的用法,只有DATE

    “VEVENT”也是日历组件,用于指定 日历中的周年纪念日或每日提醒。这些事件 具有“DTSTART”属性的 DATE 值类型,而不是 默认值类型为 DATE-TIME。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多