使用 Joda 时间解析 ZonedDateTime#toString() 时失败
Failure while parsing ZonedDateTime#toString() with Joda time
使用 Elasticsearch 1.x(1.7.5 取决于 Joda time 1.6),我可以使用自定义日期时间格式 "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[ZZZ]" 来解析通过 ZonedDateTime#toString() 获得的序列化字符串(例如'2016-11-29T18:47:21.766+01:00[Europe/Paris]') 到时间戳。
使用 Elasticsearch 2.4.1(取决于 Joda time 2.9.4),我不能再这样了。它因 "java.lang.IllegalArgumentException: Invalid format: "2016-11-29T18:47:21.766+01:00[Europe/Paris]" is malformed at "Europe/Paris]"" 异常而失败。
编辑:这是关于 Elasticsearch Java API.
EDIT2:我只是想将 Java 8 DateTimeFormatter#ISO_ZONED_DATE_TIME 翻译成一个格式字符串,可以使用 Joda#forPattern(String, Locale)[=12= 构建一个有效的 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);
该代码片段失败,出现以下异常:
FAILED: parseMillisTest
java.lang.IllegalArgumentException: Invalid format: "2016-11-29T18:47:21.766+01:00[Europe/Paris]" is malformed at "Europe/Paris]"
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)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:753)
at org.testng.TestRunner.run(TestRunner.java:607)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:368)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:321)
at org.testng.SuiteRunner.run(SuiteRunner.java:270)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
at org.testng.TestNG.runSuites(TestNG.java:1124)
at org.testng.TestNG.run(TestNG.java:1096)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)
- 我是否认为 Joda Time 2.9.4 在这方面存在缺陷?
- 希望我确实错了,解析这样的“2016-11-29T18:47:21.766+01:00[Europe/Paris]”字符串的正确格式是什么?
从 jodatime 2.9.4 升级到 jodatime 2.9.5 解决了这个问题。
使用 Elasticsearch 2.4.2(取决于 jodatime 2.9.5),问题就消失了。我只是 运行 再次测试,他们通过了。
我再次尝试了依赖于 jodatime 2.9.4 的测试,但它失败了。 2.9.5 工作正常。
不要考虑我最后的评论,这是错误的。我一定是在依赖项上做错了。
使用 Elasticsearch 1.x(1.7.5 取决于 Joda time 1.6),我可以使用自定义日期时间格式 "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[ZZZ]" 来解析通过 ZonedDateTime#toString() 获得的序列化字符串(例如'2016-11-29T18:47:21.766+01:00[Europe/Paris]') 到时间戳。
使用 Elasticsearch 2.4.1(取决于 Joda time 2.9.4),我不能再这样了。它因 "java.lang.IllegalArgumentException: Invalid format: "2016-11-29T18:47:21.766+01:00[Europe/Paris]" is malformed at "Europe/Paris]"" 异常而失败。
编辑:这是关于 Elasticsearch Java API.
EDIT2:我只是想将 Java 8 DateTimeFormatter#ISO_ZONED_DATE_TIME 翻译成一个格式字符串,可以使用 Joda#forPattern(String, Locale)[=12= 构建一个有效的 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);
该代码片段失败,出现以下异常:
FAILED: parseMillisTest java.lang.IllegalArgumentException: Invalid format: "2016-11-29T18:47:21.766+01:00[Europe/Paris]" is malformed at "Europe/Paris]" 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) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) at org.testng.TestRunner.privateRun(TestRunner.java:753) at org.testng.TestRunner.run(TestRunner.java:607) at org.testng.SuiteRunner.runTest(SuiteRunner.java:368) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:321) at org.testng.SuiteRunner.run(SuiteRunner.java:270) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284) at org.testng.TestNG.runSuitesLocally(TestNG.java:1209) at org.testng.TestNG.runSuites(TestNG.java:1124) at org.testng.TestNG.run(TestNG.java:1096) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)
- 我是否认为 Joda Time 2.9.4 在这方面存在缺陷?
- 希望我确实错了,解析这样的“2016-11-29T18:47:21.766+01:00[Europe/Paris]”字符串的正确格式是什么?
从 jodatime 2.9.4 升级到 jodatime 2.9.5 解决了这个问题。 使用 Elasticsearch 2.4.2(取决于 jodatime 2.9.5),问题就消失了。我只是 运行 再次测试,他们通过了。
我再次尝试了依赖于 jodatime 2.9.4 的测试,但它失败了。 2.9.5 工作正常。 不要考虑我最后的评论,这是错误的。我一定是在依赖项上做错了。