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?
 

beta20

Top Contributor
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?
 

beta20

Top Contributor
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
 

LimDul

Top Contributor
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.
 

beta20

Top Contributor
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?
 

LimDul

Top Contributor
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.
 

LimDul

Top Contributor
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.
 

LimDul

Top Contributor
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.
 

beta20

Top Contributor
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?
 

LimDul

Top Contributor
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.
 

beta20

Top Contributor
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
 

LimDul

Top Contributor
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 :D
 

beta20

Top Contributor
vllt. bin ich das zu sehr von Outlook gewöhnt... nunja... daran muss ich mich erst mal gewöhnen.

Vielen Dank für die Hilfe
 

LimDul

Top Contributor
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)
 

mrBrown

Super-Moderator
Mitarbeiter
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.
 

Neue Themen


Oben