【问题标题】:Convert Date from ISO 8601 Zulu string to java.time.Instant in Java 8在 Java 8 中将日期从 ISO 8601 Zulu 字符串转换为 java.time.Instant
【发布时间】:2019-01-25 09:31:12
【问题描述】:

我想把字符串日期格式转换成java.time.Instant

我在解析日期时遇到异常。

 java.lang.IllegalArgumentException: Too many pattern letters: s

我使用下面的代码首先从字符串转换为日期。

    String string = "2018-07-17T09:59:51.312Z";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD'T'hh:mm:ss.sssZ", Locale.FRANCE);
    LocalDate date = LocalDate.parse(string, formatter);
    System.out.println(date);

我想将 "timestamp": "2018-07-17T09:59:51.312Z" 转换为 ISO 8601 格式的时间格式 YYYY-MM-DDThh:mm:ss.sssZ 在 UTC 时区。

检查了Java string to date conversion,但没有工作。

【问题讨论】:

    标签: java datetime java-8 datetime-format java.time.instant


    【解决方案1】:

    不要构建自己的格式化程序

    不要为编写自己的格式模式字符串而苦恼。您的字符串采用 java.time 内置的 ISO 8601 格式。解析成java.time.Instant(正如你的标题所说):

        String string = "2018-07-17T09:59:51.312Z";
        Instant inst = Instant.parse(string);
        System.out.println(inst);
    

    输出:

    2018-07-17T09:59:51.312Z

    解析成LocalDate(正如您的代码 sn-p 似乎打算的那样):

        LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
        System.out.println(date);
    

    2018-07-17

    你的代码出了什么问题?

    格式模式字母区分大小写(您也可以从您要链接到的问题的第一个答案中的表格中看到这一点)。

    • 您使用大写的YYYY 表示年份。大写的Y 表示周年,仅对周数有用。使用uuuu 或小写yyyy 表示年份。
    • 大写的DD 表示一年中的某一天。对于月份中的某天,您需要小写 dd
    • 小写的hh 表示从01 到12 的AM 或PM 小时,仅对AM/PM 标记有用。您需要大写 HH 来表示一天中从 00 到 23 的时间。
    • 最后你正确地使用了小写ss 表示秒,但也正确使用了sss 表示秒的分数。对于后者,您需要大写的SSS。此错误是您的错误消息的原因:由于秒数最多为 60(包括闰秒),因此 sss 中的三个 s 没有意义,DateTimeFormatter 对此表示反对。来自文档:

      最多可以指定两个字母“d”、“H”、“h”、“K”、“k”、“m”和“s”。

    链接:DateTimeFormatter documentation

    【讨论】:

      【解决方案2】:

      tl;博士

      将字符串日期格式转换为java.time.Instant

      跳过格式化模式。只需解析。

      Instant.parse( "2018-07-17T09:59:51.312Z" )
      

      ISO 8601

      是的,您使用了不正确的格式模式,如 first Answer 所示。

      但是您根本不需要指定格式模式。您的输入字符串采用标准ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。

      末尾的Z 表示UTC,发音为“Zulu”。

      Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 2019-06-12
        相关资源
        最近更新 更多