将日期从ISO 8601 Zulu字符串转换为Java 8中的java.time.Instant

sur*_*day 5 java datetime datetime-format java-8 java.time.instant

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

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

 java.lang.IllegalArgumentException: Too many pattern letters: s
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码进行转换,从String到date.

    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);
Run Code Online (Sandbox Code Playgroud)

我想转换"timestamp":"2018-07-17T09:59:51.312Z"YYYY-MM-DDThh:mm:ss.sssZUTC时区中以ISO 8601格式的格式时间.

检查Java字符串到日期的转换,但不起作用.

Bas*_*que 6

TL;博士

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

跳过格式化模式.只是解析.

Instant.parse( "2018-07-17T09:59:51.312Z" )
Run Code Online (Sandbox Code Playgroud)

ISO 8601

是的,您使用了错误的格式设置模式,如第一个答案中所示.

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

Z上月底表示UTC,发音为"祖鲁".

Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Ole*_*.V. 6

Don\xe2\x80\x99t 构建自己的格式化程序

\n\n

Don\xe2\x80\x99t 不会为编写自己的格式模式字符串而苦苦挣扎。您的字符串采用内置于 java.time 中的 ISO 8601 格式。解析为java.time.Instant(如你的标题所示):

\n\n
    String string = "2018-07-17T09:59:51.312Z";\n    Instant inst = Instant.parse(string);\n    System.out.println(inst);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
\n

2018-07-17T09:59:51.312Z

\n
\n\n

解析为LocalDate(正如您的代码片段似乎想要的那样):

\n\n
    LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_OFFSET_DATE_TIME);\n    System.out.println(date);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2018-07-17

\n
\n\n

你的代码出了什么问题?

\n\n

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

\n\n
    \n
  • 您使用大写字母YYYY表示年份。大写字母Y表示周年,仅适用于周数。使用uuuu或 小写字母yyyy表示年份。
  • \n
  • 大写字母DD代表一年中的某一天。对于月份中的某一天,您需要小写dd
  • \n
  • 小写字母hh表示从 01 到 12 的 AM 或 PM 的小时,并且仅与 AM/PM 标记一起使用。HH一天中从 00 到 23 的小时需要大写。
  • \n
  • 最后,您正确地使用了小写字母ss表示秒,但也正确sss使用了小写字母。对于后者,您需要大写SSS。此错误是您的错误消息的原因:由于秒最多只能达到 60(包括闰秒),因此 3 是s没有sss意义的,并且DateTimeFormatter对此表示反对。从文档中:

    \n\n
    \n

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

    \n
  • \n
\n\n

链接:DateTimeFormatter文档

\n