在Java 8中将Date从ISO 8601 Zulu字符串转换为java.time.Instant

时间:2018-08-18 16:34:24

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

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

解析日期时出现异常。

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

我正在使用以下代码首先从String转换为日期。

    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);

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

已检查Java string to date conversion,但不起作用。

2 个答案:

答案 0 :(得分:6)

tl; dr

  

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

跳过格式设置模式。只是解析。

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

ISO 8601

是的,您使用了first Answer中指示的格式错误。

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

最后的Z表示UTC,发音为“祖鲁语”。

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

关于 java.time

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分: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(如您的代码片段所示):

    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标记一起使用。从00到23,您需要在一天的小时中使用大写字母HH
  • 最后,您正确使用了小写的ss秒钟,但也使用了sss的秒钟。对于后者,您需要大写的SSS。此错误是您收到错误消息的原因:由于秒数最多只能达到60(包括a秒),因此s中的三个sss毫无意义,并且DateTimeFormatter反对这个。从文档中:

      

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

链接:DateTimeFormatter documentation