2014-10-02 8 views
6

Warum kann ich das folgende Datum nicht analysieren?Parsing DateTime - Ungültiger Zeitpunkt wegen Zeitzonen-Offset-Übergang (Europa/Berlin)

DateTime.parse("2015-03-29 02:35:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")); 

Ergebnis:

org.joda.time.IllegalInstantException: Cannot parse "2015-03-29 02:35:00": Illegal instant due to time zone offset transition (Europe/Berlin) 
    at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:471) 
    at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:411) 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:882) 
    at org.joda.time.DateTime.parse(DateTime.java:160) 
    at Testasd.test(Testasd.java:9) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Was hier das Problem? Wenn ich das Jahr zu 2014-03-29 02:35:00 ändere es funktioniert!

Antwort

12

Da diese link erklärt:

Joda-Time nur die wichtigsten Klassen gültiges Datum Zeiten zu speichern. Für Beispiel, 31. Februar ist kein gültiges Datum, so dass es (außer in Teilweise) nicht gespeichert werden kann. Für gilt das gleiche Prinzip gültiger Datum-Uhrzeit (DST). An vielen Orten wird DST verwendet, wo die Ortszeit im Frühjahr um eine Stunde nach vorne und im Herbst/Herbst um eine Stunde nach hinten um vorrückt. Dies bedeutet, dass es im Frühjahr eine "Lücke" gibt, wo eine lokale Zeit nicht existiert. Der Fehler "Ungültiger Zeitpunkt aufgrund der Zeitzone Offset-Übergang" bezieht sich auf diese Lücke. Es bedeutet, dass Ihre Anwendung versucht, ein Datum-Uhrzeit innerhalb der Lücke zu erstellen - eine Zeit, die nicht vorhanden ist. Da Joda-Time-Objekte gültig sein müssen, ist dies nicht erlaubt.

Sie verweisen auf eine Datetime, die aufgrund von Änderungen der Sommerzeit nicht vorhanden ist.

Eine Lösung besteht darin, stattdessen parseLocalDateTime zu verwenden.

+0

Ok das hat funktioniert und korrigiert die ungültigen Zeiten. 'DateTimeFormat.forPattern (" JJJJ-MM-TT HH: mm: ss "). ParseLocalDateTime (..);' – membersound

Verwandte Themen