DateTimeParseException

Diskutiere DateTimeParseException im Java Basics - Anfänger-Themen Bereich.
B

beta20

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?
 
B

beta20

hm ok, das wird dann nicht automatisch umgewandelt? da ich ja das habe: HHmmss
 
B

beta20

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?
 
L

LimDul

Falsche Zeitzone, vermutlich sind die Zeiten Utc und du liest sie als MESZ ein.
 
B

beta20

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
 
L

LimDul

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.
 
B

beta20

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?
 
B

beta20

Weil der Feiertag nur ein Tag ist? Verstehe nicht, warum dann der nächste Tag ebenfalls zählt?
 
L

LimDul

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.
 
B

beta20

Das wäre für mich: 11.06.2020 00:00 - 11.06.2020 23:59
-> also gleicher Tag
 
L

LimDul

Also wäre für dich 23:59:59 nicht mehr Fronleichnam? Die letze Minute zählt also nicht mehr mit?
 
L

LimDul

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.
 
L

LimDul

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.
 
B

beta20

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?
 
L

LimDul

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.
 
Thema: 

DateTimeParseException

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben