使用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)
答案 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工作正常。 不要考虑我的最后评论,这是错误的。我必须对依赖项做错了。