DateTimeParseException

beta20

Top Contributor
Hallo,

ich bekomme bei folgendem Code eine DateTimeParseException:

Java:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss");
String startTime = component.getProperty(Property.DTSTART).getValue();
LocalDateTime startDate = LocalDateTime.parse(startTime, formatter);

Hinweis:
Component ist von der Klasse: net.fortuna.ical4j.model.Component

Folgender Fehler habe ich:
"Text '20060101' could not be parsed at index 8"

Was mache ich hier denn falsch?
 
Ich habe es nun jedoch auch anders gelöst, in dem ich es in ein VEvent umwandle, so hat es funktioniert:

Java:
            VEvent event = (VEvent) component;
            DtStart dateStart = event.getStartDate();
            DtEnd dateEnd = event.getEndDate();
       
            LocalDateTime startDate = dateStart.getDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
            LocalDateTime endDate = dateEnd.getDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

Nun habe ich allerdings ein anderes Problem:

Ich habe mal einen öffentlichen Ical Kalender angebunden: https://www.thunderbird.net/media/caldata/GermanHolidays.ics
Das Auslesen funktioniert auch, aber bspw. beim "Fronleichnam" ist das Datum vom:
11.06.2020, 02:00 Uhr
-
12.06.2020 02:00 uhr

Es sollte ja nur ein Tag sein, es geht aber über 2 Tage?

Eine Idee woran das liegt?
 
Habe es erweitert, aber immer noch das gleiche Ergebnis...

Java:
        VEvent event = (VEvent) component;
            TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
            TimeZone timezone = registry.getTimeZone("Europe/Berlin");
            VTimeZone tz = timezone.getVTimeZone();
            event.getProperties().add(tz.getTimeZoneId());

            DtStart dateStart = event.getStartDate();
            DtEnd dateEnd = event.getEndDate();

            LocalDateTime startDate = dateStart.getDate().toInstant().atZone( ZoneId.of( "Europe/Berlin" )).toLocalDateTime();
            LocalDateTime endDate = dateEnd.getDate().toInstant().atZone( ZoneId.of( "Europe/Berlin" )).toLocalDateTime();


Das bekomme ich aus dem ical zurück:

Code:
BEGIN:VEVENT
CREATED:20061023T132503Z
LAST-MODIFIED:20101205T150148Z
DTSTAMP:20101205T150148Z
UID:928286484
SUMMARY:Neujahr
STATUS:CONFIRMED
RRULE:FREQ=YEARLY;BYMONTH=1
CATEGORIES:Feiertag
DTSTART;VALUE=DATE:20060101
DTEND;VALUE=DATE:20060102
END:VEVENT
 
Ich hab keine Ahnung, was du da tust - aber sieht wie ziemlich viel Unfug aus.

Java:
            event.getProperties().add(tz.getTimeZoneId());
Das kann meines Erachtens nicht funktionieren, nur weil du da in irgendwelche Properties einen String reinsteckst, der eine Zeitzone ist, erkennt der das nicht als Zeitzone. Die Beispiele die ich hier sehe http://ical4j.github.io/docs/ical4j/api/2.0-beta1/net/fortuna/ical4j/model/component/VEvent.html sehen auch ganz anders aus:
Java:
 // add timezone information..
 VTimeZone tz = VTimeZone.getDefault();
 TzId tzParam = new TzId(tz.getProperties().getProperty(Property.TZID)
         .getValue());
 christmas.getProperties().getProperty(Property.DTSTART).getParameters().add(
         tzParam);
Das zweite - du liest ein Event, ich weiß nicht, was du dir davon erhoffst, wenn du das Event, was du gelesen hast mit anderen Zeitzone Infos versiehst.

Nimm deinen ersten Code und anstelle von systemDefault nimm UTC und dann sollte es gehen.

Bzw. sauber wäre es die Zeitzone des Events zu lesen also die getter der Properties aufzurufen und dann die entsprechende Zeitzone beim konverierten zu setzen.
 
Danke.

Also im Kalender sieht es nun gut aus, es ist nur ein Tag.... Verstehe ich nun überhaupt nicht.
Aber dennoch bekomme ich nun nicht den gleichen Tag beim Laden.

Java:
            VEvent event = (VEvent) component;

            DtStart dateStart = event.getStartDate();
            DtEnd dateEnd = event.getEndDate();

            LocalDateTime startDate = dateStart.getDate().toInstant().atZone( ZoneId.of( "UTC" )).toLocalDateTime();
            LocalDateTime endDate = dateEnd.getDate().toInstant().atZone( ZoneId.of( "UTC" )).toLocalDateTime();

Bpsw. Fronleichnam ist nun:
Start: 11.06.2020 00:00
Ende: 12.06.2020 00:00

Das gleiche eben auch bei startDate / endDate...

Aber irgendwie kommt das auch schon vom Kalender?

DTSTART;VALUE=DATE:20060101
DTEND;VALUE=DATE:20060102

Müsste doch 2x 20060101 sein?
 
Der zählt doch nicht mit. Die Uhrzeit ist 0 Uhr. Schreibt doch mal - mit Uhrzeiten auf - von wann bis für dich Fronleichnam gelten würde.
 
Und die letzte Sekunde zählt nicht mehr mit? 23:59:59,9 ist also nicht mehr Fronleichnam?

Kleiner Tipp: Das Spielchen kann man endlos machen. Für jede Endzeit die du angibst, kann ich hinter dem Komma noch Stelle anhängen.

Die Reihe konvergiert - auf den 11.06.2020 24 Uhr - was es nicht gibt und was damit dem 12.06.2020 0 Uhr entspricht.
 
Nachtrag:
Was vielleicht zum Verständnis hilft, wenn du einen Termin hast, der eine Stunde geht und um 14 Uhr beginnt - dann ist die Endzeit auch 15 Uhr und nicht 14:59:59. Also der Beginn der nächsten Stunde. Das gleiche mit ganztätigen Events -das Ende ist der Beginn des nächsten Tages.
 
ok, verstehe... Danke für die Aufklärung.

Aber wie soll ich das dann lösen?
Wenn startDate / endDate genau Tag+1 haben, dann wieder ein Tag abziehen?
LocalDateTime endDate = dateEnd.getDate().toInstant().atZone( ZoneId.of( "UTC" )).toLocalDateTime();

Das ist doch bestimmt nicht die richtige Lösung dazu?
 
Die Frage ist, was willst du genau tun mit den Daten? Einen Tag abziehen wäre grober Unfug. Die Daten stimmen - die Frage ist nur, was du damit anstellen willst.
 
Nunja, in meinem Kalender passt es... Es ist nur ein Tag...

Aber wenn ich auf das Event klicke und die Details ansehe, dann bekomme ich das.
"Bis" ist doch definitiv falsch..
Meinetwegen 2x 11.06.2020 00:00 oder 11.06.2020 23:59
1592855928088.png
 
Wobei Outlook es falsch tatsächlich als 11.06.2020 0 Uhr bis 11.06.2020 0 Uhr anzeigt, interessanterweise. Deine Darstellung ist zwar korrekt, aber Outlook macht es tatsächlich in der Anzeige anders.

Trage ich aber ein Event in Outlook 11.06.2020 0 Uhr bis 11.06.2020 0 Uhr ein, da ist das quasi ein 0 Sekunden Event was nicht ganztägig ist 😀
 
Ich glaube das ist der Punkt, warum bei ganz-Tages Events oftmals die Uhrzeit ausgeblendet wird (das macht der Google Calender z.B.).

Ich würde mal zusammenfassend:
* Technisch ist 11.06.2020 00:00 bis 12.06.2020 00:00 korrekt
* In der Anzeige kann es aber sinnvoll sein, solche Events (mit Beginn und Ende 00 Uhr) ohne Anzeige der Uhrzeit anzuzeigen und dann entsprechend als Ganztages Events anzuzeigen und als Intervall zu betrachten, wo der Endpunkt nicht teil des Intervalls ist. Also beim ausblenden der Uhrzeit dann (und nur dann) zur Anzeige das Enddatum um einen Tag reduzieren (Aber halt rein zur Anzeige)
 
Du könntest bei der Anzeige ein bisschen tricksen und den Endzeitpunkt als 24:00 anzeigen lassen.
11.06.2020 00:00 bis 12.06.2020 00:00 wäre dann 11.06.2020 00:00 bis 11.06.2020 24:00.
 

Zurück
Oben