将此 "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 格式的字符串转换为 LocalDate
Convert String of this "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" format to 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
class 表示 时间点 ,而不是本地日期。恰好 Date.toString
输出的字符串就好像它在系统时区一样。
java.time API 迫使你更深入地思考你想要什么。它为您提供了不同的类型来表示不同的时间概念。 LocalDate.parse
只会解释字符串的 "local date" 部分。
您的日期字符串代表 OffsetDateTime
,因此您应该使用 OffsetDateTime.parse
。现在你有一个 LocalDateTime
加上一个 ZoneOffset
。要使它成为 09-01,你必须改变它的区域,同时保持它相同的时刻,这可以用 atZoneSameInstant
完成,然后获取它的本地日期部分:
System.out.println("LocalDate: " +
OffsetDateTime.parse(date, DateTimeFormatter.ofPattern(format))
.atZoneSameInstant(ZoneOffset.systemDefault())
.toLocalDate());
我想将字符串日期(指定时区)转换为 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
class 表示 时间点 ,而不是本地日期。恰好 Date.toString
输出的字符串就好像它在系统时区一样。
java.time API 迫使你更深入地思考你想要什么。它为您提供了不同的类型来表示不同的时间概念。 LocalDate.parse
只会解释字符串的 "local date" 部分。
您的日期字符串代表 OffsetDateTime
,因此您应该使用 OffsetDateTime.parse
。现在你有一个 LocalDateTime
加上一个 ZoneOffset
。要使它成为 09-01,你必须改变它的区域,同时保持它相同的时刻,这可以用 atZoneSameInstant
完成,然后获取它的本地日期部分:
System.out.println("LocalDate: " +
OffsetDateTime.parse(date, DateTimeFormatter.ofPattern(format))
.atZoneSameInstant(ZoneOffset.systemDefault())
.toLocalDate());