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

标签 elasticsearch java-8 jodatime

使用Elasticsearch 1.x(1.7.5取决于Joda时间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时间2.9.4),我再也不能了。它失败,并出现“java.lang.IllegalArgumentException:无效格式:“2016-11-29T18:47:21.766 + 01:00 [Europe / Paris]”在“Europe / Paris]处的格式错误”。

编辑:这是关于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);

该代码段因以下异常而失败:

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 - 使用Joda时间解析ZonedDateTime#toString()时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873024/

    相关文章:

    google-maps-api-3 - Elasticsearch geo_bbox 与 Google Places API 视口(viewport)位置

    Java 方法引用解析

    java - Java 中的 DynamoDB 格式字符串日期

    当 joda-time 达到闰日时,jvm 去优化会占用 CPU

    java - 如何使用 apache.httpcomponents.httpclient 在 Elasticsearch 中执行搜索模板

    api - 如何在 Elastic Search 中处理 "private"数据

    Java 8 流分组。如果只有一个分组值对象,如何设置字段?

    java - 如何插入 780k 记录 Spring Data Postgres

    java - 检查当前时间是午夜还是 Joda Time 的第二天?