web-dev-qa-db-fra.com

Joda Time: format non valide. Les données sont mal formées

Essayer de traiter cette chaîne avec la date et l'heure:

2015-10-23T00:00:00+03:00

En utilisant ce code:

String transactionDateValue = getNodeValue(nodeList, i, "transactionDate");
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss ZZZ");
DateTime jodaTime = dateTimeFormatter.parseDateTime(transactionDateValue);
DateTimeFormatter resultFormat = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");

Voici l'erreur:

Java.lang.IllegalArgumentException: Invalid format: "2015-10-23T00:00:00+03:00" is malformed at "T00:00:00+03:00"

    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.Java:945)
    at repgen.service.PrepareExcelService.fillContent(PrepareExcelService.Java:169)
    at repgen.service.PrepareExcelService.prepareDocument(PrepareExcelService.Java:44)
    at repgen.service.PrepareExcelServiceTest.testPrepareExcelService(PrepareExcelServiceTest.Java:52)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
    at org.mockito.internal.junit.JUnitRule$1.evaluate(JUnitRule.Java:16)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.Java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.Java:62)
    at org.junit.runner.JUnitCore.run(JUnitCore.Java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:117)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:42)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.Java:262)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.Java:84)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:147)

Je soupçonne que mon erreur est proche du paramètre ZZZ, mais je ne peux pas le résoudre. J'ai également essayé les paramètres ZZZZ, ZZ, mais cela ne l'a pas corrigé.

9
Deniss M.

Cela se produit car la chaîne que vous essayez d'analyser contient un T, qui n'est pas dans la chaîne de format.

Vous essayez d'analyser une chaîne au format standard ISO 8601 . Vous n'avez pas besoin d'une chaîne de format de date personnalisée pour cela, car Joda Time prend déjà en charge ce format par défaut. Faites juste:

DateTime jodaTime = DateTime.parse(transactionDateValue);
14
Jesper

Votre format doit être:

DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");

Elle doit être exactement comme la chaîne de date, avec les valeurs fixes échappées par des guillemets simples et sans espaces supplémentaires. Vous devez également utiliser HHpour un format de 24 heures. hh est au format 12 heures et commence à 1 et se termine à 12

5
Jens