将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate相关的知识,希望对你有一定的参考价值。

我想将字符串日期(指定了时区)转换为LocalDate。

String format = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
String date = "2019-08-31T17:00:00.000-07:00";

System.out.println("LocalDate: " + LocalDate.parse(date, DateTimeFormatter.ofPattern(format)));
System.out.println("Date: " + new SimpleDateFormat(format).parse(date));

上面的代码的输出是

LocalDate: 2019-08-31
Date: Sun Sep 01 05:30:00 IST 2019

我无法获得与SimpleDateFormat相同的结果。我想要LocalDate中的2019-09-01。

答案

请注意,旧的Date类表示时间点,而不是本地日期。碰巧Date.toString输出的字符串就像在系统时区一样。

java.time API迫使您对想要的东西进行更深入的思考。它提供了不同的类型来表示不同的时间概念。 LocalDate.parse仅会解释字符串的“本地日期”部分。

您的日期字符串代表OffsetDateTime,因此您应该使用OffsetDateTime.parse。现在您有了一个LocalDateTime加一个ZoneOffset。要使其成为09-01,您必须更改其时区,同时保持其相同的瞬间(可以使用atZoneSameInstant完成),然后获取其本地日期部分:

System.out.println("LocalDate: " +
        OffsetDateTime.parse(date, DateTimeFormatter.ofPattern(format))
                .atZoneSameInstant(ZoneOffset.systemDefault())
                .toLocalDate());

以上是关于将这种“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式的字符串转换为LocalDate的主要内容,如果未能解决你的问题,请参考以下文章

JAVA时间 yyyy-MM-dd'T'HH:mm:ss.SSSZ 中的T是啥意思??

spring cloud中微服务调用出现 Can not parse date while it seems to fit format 'yyyy-MM-dd'T'HH:mm

utc时间转毫秒

utc时间转毫秒

Springboot入参时间格式问题

IDEA插件系列(69):Current date generator插件——快速生成当前日期