java - 将此“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());
推荐阅读
- sql-server - SQL 连接查询与“on”异常
- next.js - 从 next.js 项目上传源地图到哨兵的推荐方法是什么
- c++11 - 字符串化宏中的参数
- python - 我想将我的 Minecraft 控制台数据发送到我的应用程序中
- powershell - 在我的函数中使用 Switch 的问题
- amazon-web-services - 将秒数格式化为 Redshift 中的间隔 HH:MM:SS
- swift - Swift AutoDiff:我们如何使结构具有一个成员变量,该成员变量是多个参数的可微函数?
- mongodb - Mongoose $or 运算符无法正常工作
- url - Opencart - 更改产品的默认地址
- unity3d - 当我使用这个脚本时,它会导致我的游戏崩溃。我究竟做错了什么?