Java,导入 Outlook 或 Thunderbird 时 ICS 日历格式不显示时间
Java, ICS calendar format not showing time when imported in Outlook or Thunderbird
我正在处理一个 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 中没有提到时间。我究竟做错了什么?谢谢你。
您只是为 VEVENT
的 DTSTART
和 DTEND
属性指定了 DATE
而不是 DATE-TIME
。
注意:它们是 Date-Time Start 和 Date-Time End 的缩写。
有关详细信息,您可以参考 RFC5545,特别是 DATE-TIME, or DTSTART, and VEVENT。
第二个,也会提醒你DTSTART
默认是使用DATE-TIME
格式,而不是DATE
格式。
第三个表示 DTSTART
的用法,只有 DATE
值
The "VEVENT" is also the calendar component used to specify an
anniversary or daily reminder within a calendar. These events
have a DATE value type for the "DTSTART" property instead of the
default value type of DATE-TIME.
我正在处理一个 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 中没有提到时间。我究竟做错了什么?谢谢你。
您只是为 VEVENT
的 DTSTART
和 DTEND
属性指定了 DATE
而不是 DATE-TIME
。
注意:它们是 Date-Time Start 和 Date-Time End 的缩写。
有关详细信息,您可以参考 RFC5545,特别是 DATE-TIME, or DTSTART, and VEVENT。
第二个,也会提醒你DTSTART
默认是使用DATE-TIME
格式,而不是DATE
格式。
第三个表示 DTSTART
的用法,只有 DATE
值
The "VEVENT" is also the calendar component used to specify an anniversary or daily reminder within a calendar. These events have a DATE value type for the "DTSTART" property instead of the default value type of DATE-TIME.