在 Java 中解析日期字符串

Sun*_*nny 1 java datetime parseexception datetime-parsing

我的日期格式为“yyyy-MM-dd'T'HH:mm:ss.sssZ”。例如日期是“2018-07-17T09:59:51.312Z”。我正在使用下面的代码来解析 Java 中的字符串。

  String date="2018-07-17T09:59:51.312Z";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssZ");
   Date transactionDateTime = simpleDateFormat.parse(date);
Run Code Online (Sandbox Code Playgroud)

这给了我“无法解析的日期:”异常。谁能告诉我如何做到这一点?

ach*_*áin 5

您应该考虑在此示例中使用DateTimeFormatterZonedDateTimeDate并且SimpleDateFormat是旧类,并且容易出错并且可能有问题;提到的较新的类(Java8+)更加健壮。

并将模式的结尾从 更改...mm:ss.sssZ...mm:ss.SSSz

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");
ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
System.out.println(formatter.format(zonedDateTime));
Run Code Online (Sandbox Code Playgroud)

您还可以使用OffsetDateTimeInstant(信用:Ole VV),它们会为您解析,给出相同的输出:

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

输出:

2018-07-17T09:59:51.312Z

  • 使用现代日期和时间 API 是一个好主意。`ZonedDateTime` 有点矫枉过正,因为字符串没有时区,只有偏移量。使用 `OffsetDateTime` 或 `Instant`,选择取决于更精确的要求。即使没有“DateTimeFormatter”,这些类也会解析,因为格式是 ISO 8601,现代类的默认格式。 (2认同)