web-dev-qa-db-ja.com

Joda Time:無効な形式。データの形式が正しくありません

この文字列を日付と時刻で処理しようとしています:

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

このコードを使用して:

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");

これはエラーです:

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)

エラーはZZZパラメーターの近くにあると思われますが、解決できません。パラメーターZZZZ、ZZも試してみましたが、それで解決しませんでした。

9
Deniss M.

これは、解析しようとしている文字列にTが含まれていますが、これはフォーマット文字列ではありません。

標準の ISO 8601 形式の文字列を解析しようとしています。 Joda Timeはデフォルトですでにこの形式をサポートしているため、このためにカスタムの日付形式文字列は必要ありません。ただやる:

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

形式は次のとおりである必要があります。

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

日付文字列とまったく同じである必要があり、固定値は単一引用符でエスケープされ、追加の空白はありません。また、24時間形式でHHを使用する必要があります。 hhは12時間形式で、1で始まり12で終わります

5
Jens