创建 ical 文件,不附加 UTC 的 Z

Creating the ical file not appending Z for UTC

提问人:Sivaranjani Duraisamy 提问时间:11/10/2023 最后编辑:Sivaranjani Duraisamy 更新时间:11/11/2023 访问量:30

问:

我有以下代码,它成功生成了ics文件。但是我希望 DTSTART 在末尾附加 Z,因为它是 UTC,但这并没有发生。

  public class IcalGenerator {

    public static void main(String[] args) {

        /* Create the event */
        String eventSummary = "New Year";
        LocalDateTime start = LocalDateTime.now(ZoneId.of("UTC"));
        VEvent event = new VEvent(start, Duration.of(30, ChronoUnit.MINUTES), eventSummary);
        event.add(new Clazz(Clazz.VALUE_PUBLIC));
        event.add(new Description("New meeting"));

        /* Create calendar */
        Calendar icsCalendar = new Calendar();
        var version = new Version();
        version.setValue(Version.VALUE_2_0);
        icsCalendar.add(version);

        // Set the location
        Location location = new Location("Conference Room");

        // Add the Location to the event
        event.add(location);

        /* Add event to calendar */
        icsCalendar.add(event);

        /* Create a file */
        String filePath = "my_meeting.ics";
        FileOutputStream out = null;
        try {

            out = new FileOutputStream(filePath);
            CalendarOutputter outputter = new CalendarOutputter();
            outputter.output(icsCalendar, out);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ValidationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

你能帮我缺少什么吗?我最终想要 DTSTART:20231110T164148Z 而不是 DTSTART:20231110T164148

当我手动附加 Z 时,它效果很好。

Java iCalendar ical4J

评论

0赞 user85421 11/10/2023
LocalDateTime没有时区信息;如果使用 OR 和 UTC 作为时区,会发生什么情况?(我不知道,所以只是猜测)OffsetDateTimeZonedDateTimeVEvent
0赞 Sivaranjani Duraisamy 11/10/2023
它仍然没有附加 Z

答:

0赞 fortuna 11/11/2023 #1

以下是 ical4j 单元测试中的一些示例:

        date                                                | expectedString
    LocalDate.of(2023, 11, 10)                          | 'DTSTART;VALUE=DATE:20231110\r\n'
    LocalDateTime.of(2023, 11, 10, 1, 1, 1)             | 'DTSTART:20231110T010101\r\n'
    LocalDateTime.of(2023, 11, 10, 1, 1, 1)
            .atZone(ZoneId.of('Australia/Melbourne'))   | 'DTSTART;TZID=Australia/Melbourne:20231110T010101\r\n'
    LocalDateTime.of(2023, 11, 10, 1, 1, 1)
            .toInstant(ZoneOffset.UTC)                  | 'DTSTART:20231110T010101Z\r\n'

目前 a 在 ical4j 中被解释为浮点时间,因此您需要使用它来表示 UTC。LocalDateTimeInstant

https://github.com/ical4j/ical4j/blob/674cc6860871f9fe6157a152ad2a4436824ada04/src/test/groovy/net/fortuna/ical4j/model/property/DtStartTestSpec.groovy#L58