使用Joda时间解析ZonedDateTime#toString()时失败

时间:2016-11-29 18:21:29

标签: elasticsearch java-8 jodatime

使用Elasticsearch 1.x(1.7.5取决于Joda时间1.6),我可以使用自定义日期时间格式" yyyy-MM-dd' H&H:mm:ss.SSSZZ [ZZZ]"将使用ZonedDateTime#toString()(例如' 2016-11-29T18:47:21.766 + 01:00 [欧洲/巴黎]')获得的序列化字符串解析为时间戳。

使用Elasticsearch 2.4.1(取决于Joda时间2.9.4),我不能再这样了。它失败了" java.lang.IllegalArgumentException:格式无效:" 2016-11-29T18:47:21.766 + 01:00 [欧洲/巴黎]"在"欧洲/巴黎]""异常。

编辑:这是关于Elasticsearch Java API。

EDIT2:我只是想将Java 8 DateTimeFormatter#ISO_ZONED_DATE_TIME翻译成一个格式字符串,该字符串可以使用Joda#forPattern(String,Locale)构建一个有效的Jodatime FormatDateTimeFormatter

我在TestNG测试案例中重现了这个问题:

final ZonedDateTime now = ZonedDateTime.now();
final String strNow = now.toString();
final FormatDateTimeFormatter formatter0 = Joda.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ[ZZZ]", Locale.ROOT);
formatter0.parser().parseMillis(strNow);

该代码段失败,出现以下异常:

  

失败:parseMillisTest   java.lang.IllegalArgumentException:格式无效:" 2016-11-29T18:47:21.766 + 01:00 [欧洲/巴黎]"在"欧洲/巴黎]"       at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187)       at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826)       at org.joda.time.format.DateTimeFormatterTest.parseMillisTest(DateTimeFormatterTest.java:27)       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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100)       at org.testng.internal.Invoker.invokeMethod(Invoker.java:646)       在org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)       在org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137)       at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)       在org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)       在org.testng.TestRunner.privateRun(TestRunner.java:753)       在org.testng.TestRunner.run(TestRunner.java:607)       at org.testng.SuiteRunner.runTest(SuiteRunner.java:368)       at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363)       在org.testng.SuiteRunner.privateRun(SuiteRunner.java:321)       在org.testng.SuiteRunner.run(SuiteRunner.java:270)       在org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)       在org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)       at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)       在org.testng.TestNG.runSuitesLocally(TestNG.java:1209)       在org.testng.TestNG.runSuites(TestNG.java:1124)       在org.testng.TestNG.run(TestNG.java:1096)       at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)       在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)

  1. 我错误地认为Joda Time 2.9.4在这方面是错误的吗?
  2. 希望我确实错了,解析这样的问题可能是正确的格式2016-11-29T18:47:21.766 + 01:00 [欧洲/巴黎]'字符串?

1 个答案:

答案 0 :(得分:1)

从jodatime 2.9.4升级到jodatime 2.9.5解决了这个问题。 使用Elasticsearch 2.4.2(依赖于jodatime 2.9.5)问题已经消失。我刚刚跑了我的测试,他们通过了。

我再次尝试依赖于jodatime 2.9.4的测试,但它失败了。 2.9.5工作正常。 不要考虑我的最后评论,这是错误的。我必须对依赖项做错了。