Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date"

internet

Top Contributor
Hallo,

ich möchte gerne auf einfache Art und Weiße einen Ical Kalender von einer öffentlichen URL einlesen.
Hierzu nehme ich einen öffentlichen Kalender (siehe: https://www.officeholidays.com/subscribe/germany)

Hier die URL: https://www.officeholidays.com/ics-local-name/germany

Einlesen mache ich mit folgendem Code:

Java:
private Calendar readCalenderFromUrl() {

        System.setProperty("net.fortuna.ical4j.timezone.cache.impl", MapTimeZoneCache.class.getName());

        URL url = new URL("https://www.officeholidays.com/ics-local-name/germany");
        Calendar cal = Calendars.load(url);
        return cal;
    }

Ich bekomme aber immer einen Fehler:
net.fortuna.ical4j.data.ParserException: Error at line 14:Unparseable date: "20220602T05631Z"

Code:
<dependency>
            <groupId>org.mnode.ical4j</groupId>
            <artifactId>ical4j</artifactId>
            <version>3.0.21</version>
</dependency>

Ich habe es mal auch mit einem anderen Kalender probiert und hier bekomme ich es nicht zum Laufen.
Kann jemand helfen?
 
Naja, da hat das Ding nicht unrecht, das Datum ist irgendwie falsch:

Code:
20220602T05631Z
yyyyddMMTHHmm?Z

Nur eine einstellige Sekunde zu haben ist unueblich, sage ich mal, und die Minute "63" klingt jetzt auch nicht so richtig. Ich wuerde mal sagen dass die Datei Kacke ist. Kannst du der Seite als Fehler melden, denn soweit ich das sehe ist das einfach falsch.
 
Zuletzt bearbeitet:
Wenn du aber jetzt eine Loesung brauchst, wuerde ich die Datei vorher herunterladen, und dann das "CREATED" Feld einfach austauschen oder nachbearbeiten bevor man die Datei an ical4j uebergibt.
 
Naja, ich dachte hier gäbe es etwas standardisiertes?
Im Grund genommen möchte ich dem User die Möglichkeit geben jegliche ical Datei bei mir im System zu hinterlegen.

Anschließend wird diese eingelesen (Stream) und darauf basierend kann ich in meiner GUI dann eine Liste von diesen Daten (Termine) ausgeben...
Da muss es doch eine andere Lösung geben ist ja jetzt nicht unbedingt untypisch sowas
 
Outlook kommt damit klar.
Also erstens, was Outlook macht ist mir suspekt. Ich musste mal Emails verarbeiten in einem Programm, und jedes mal wenn es eine "Problem-Email" gab, kam die von Outlook. Zweitens, natuerlich koennen die Programme das ignorieren oder nicht, oder anders verarbeiten, oder nicht, aber die iCalendar-Spezifikation sagt:

time-hour = 2DIGIT ;00-23

Damit ist ical4j im Recht, und die Datei nicht wohlgeformt.

Damit kann man jetzt entweder dafuer sorgen dass der Hersteller der Datei das aendert, und solange man darauf wartet, die Datei "vorverarbeiten" um das zu korrigieren.
 
Also gibt es irgendeine Möglichkeit mit diesen ParserExecption umzugehen?
Ich habe gerade mal eine andere ical - Datei versucht einzulesen:

Hier wird das so gespeichert:
Java:
TSTART:20220526T220000Z
DTEND:20220526T230000Z
END:VEVENT
BEGIN:VEVENT
UID:Termin8.6@https:test.test.com
DTSTAMP:20220602T121337Z
SUMMARY:Test (tEST, Gebucht)
DESCRIPTION:Job-ID 7\n\n\n\nMitarbeiter (2/2):\nTest, Test (Aufbau; Ge
    bucht)\nTest, Test (Aufbau; Gebucht)

Bei der der Description meckert er nun wohl rum: "Error at line 29:Invalid property name"
 
Also gibt es irgendeine Möglichkeit mit diesen ParserExecption umzugehen?
Ja, du kannst die Datei vorverarbeiten.

Bei der der Description meckert er nun wohl rum: "Error at line 29:Invalid property name"
Ja, Texte duerfen nicht mehrzeilig sein, Zeilenumbrueche werden mit "\n" angegeben.

Offensichtlich halten sich viele Programme nicht so genau an die Vorgaben...musst du dann entsprechend einbauen und anpassen.
 
Die Properties könnten helfen:
ical4j.unfolding.relaxed=true
ical4j.parsing.relaxed=true
ical4j.validation.relaxed=true
ical4j.compatibility.outlook=true
 
Die Parameter helfen, vielen Dank.

Nun möchte ich das vEvent aber noch parsen... I.d.R. ist es ja mit Uhrzeit angegeben.
In dem Beispiel (siehe URL) bekomme ich es aber so:

DTSTART;VALUE=DATE:20220606

Java:
private void createBookingDate(VEvent vEvent) throws ParseException {

        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyyy-mm-dd hh:mm:ss");

        LocalDateTime startDate = LocalDateTime.parse(vEvent.getStartDate().getValue(), f);
        LocalDateTime endDate = LocalDateTime.parse(vEvent.getEndDate().getValue(), f);

        return;
    }

Wie kann ich das denn entsprechend abfangen?
 
vEvent.getStartDate().getDate() gibt dir ein Objekt, welches von java.util.Date erbt. Warum willst du es dann noch parsen, du kannst es ja direkt umwandeln.
 

Neue Themen


Zurück
Oben