11

我想将字符串日期格式转换为 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":在UTC 时区"2018-07-17T09:59:51.312Z"的 ISO 8601 格式的格式时间。YYYY-MM-DDThh:mm:ss.sssZ

检查Java 字符串到日期的转换,但不工作。

4

2 回答 2

21
于 2018-08-18T19:07:43.380 回答
3

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

不要为编写自己的格式模式字符串而苦恼。您的字符串采用 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表示小时,AM 或 PM 从 01 到 12,仅对 AM/PM 标记有用。HH从 00 到 23 的时间需要大写。
  • 最后,您正确使用了小写ss几秒钟,但也正确使用sss了几分之一秒。对于后者,您需要大写SSS。此错误是您的错误消息的原因:由于秒最多只能达到 60(包括闰秒),因此三个sas insss没有意义,并且DateTimeFormatter对此表示反对。从文档中:

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

链接:DateTimeFormatter文档

于 2018-08-18T19:09:04.337 回答