java - 将此 "yyyy-MM-dd' T'HH :mm:ss. SSSXXX"格式的字符串转换为 LocalDate

标签 java java-8 simpledateformat 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());

关于java - 将此 "yyyy-MM-dd' T'HH :mm:ss. SSSXXX"格式的字符串转换为 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536464/

相关文章:

java - 如何在Spring Boot中连接两个不同的MySQL数据库

java - 如何在参数化查询中使用 spring MVC jdbcTempates 传递字符串以删除多行

Java-8:如何在忽略区分大小写的情况下使用 Map.Entry#comparingByValue 对 Map(基于值)进行排序?

java - Formatter VS DateFormat 不一致

java - SimpleDateFormat - 如何防止时区被重新格式化

java.text.ParseException : unparsable date: "Mon, 22 Aug 2005 20:21:52 +0200" 异常

java - 在 Java 中处理和关闭窗口

java - 单线程 Java 应用程序 - htop 显示 14 行

java - Parallel Stream.forEach 抛出的异常

java - 使用 Java8 Stream 从 map 中查找最高值