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

Convert Date from ISO 8601 Zulu string to java.time.Instant in Java 8

我想将字符串日期格式转换成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"格式时间转换为UTC时区的ISO 8601格式YYYY-MM-DDThh:mm:ss.sssZ

已检查 Java string to date conversion,但没有用。

tl;博士

convert string date format into java.time.Instant

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

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

ISO 8601

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

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

最后的Z表示UTC,读作“祖鲁”。

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

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

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

java.time类在哪里获取?

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

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

不要为编写自己的格式模式字符串而苦恼。您的字符串采用 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(包括闰秒),因此 sss 中的三个 s 没有意义,并且 DateTimeFormatter objects到这个。来自文档:

    Up to two letters of 'd', 'H', 'h', 'K', 'k', 'm', and 's' can be specified.

Link: DateTimeFormatter documentation