java - 如何在 Java 8 中解析字符串 YYYYMMDD_HHMMSSZ
问题描述
我需要将 UTC 日期和时间字符串(例如 20180531_132001Z)解析为 Java 8 日期和时间对象。如何使用 Java 8 的新日期和时间库来执行此操作?我看到的大多数示例都是针对 LocalDateTime,如下所示:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss'Z'");
LocalDateTime localDateTime = LocalDateTime.parse("20180531_132001Z", formatter);
System.out.println(localDateTime);
System.out.println(localDateTime.atOffset(ZoneOffset.UTC));
代码输出:
2018-05-31T13:20:01
2018-05-31T13:20:01Z
- 这被认为是当地时间还是 UTC 时间?我正在解析的字符串值基于 UTC,所以我想知道在持久化到数据库之前是否需要做进一步的事情。
- 如果是前者,我如何将其转换为 UTC 日期和时间?
我最终需要将其保存到 SQL Server 数据库表(列类型为[datetime2](7)
,使用 [Spring] JDBC.
更新:根据评论和答案,我认为我的问题没有经过深思熟虑。换句话说,如果我得到一个输入字符串并在不考虑任何区域或偏移量的情况下解析它,我将得到一个LocalDateTime
对象。如何获取该对象并将封装的值转换为 UTC 日期和时间?
解决方案
LocalDateTime
可能会产生误导。它不代表您的本地日期/时间,它代表本地日期/时间。它根本没有时区信息。也就是说,它只是说例如“现在是 13:20”。它没有说13:20在哪里。由你来解释where部分。
由于这LocalDateTime
对于携带时间戳通常不是很有用,它仅在时区依赖于某些上下文的情况下有用。1
使用时间戳时,最好使用ZonedDateTime
orOffsetDateTime
代替。这些带有日期、时间和偏移量。
所以localDateTime.atOffset(ZoneOffset.UTC)
实际上会返回一个OffsetDateTime
, 通过解释localDateTime
为 UTC 时间的实例。
有人可能会争辩说,您可以通过首先解析时区信息来避免解释部分(即使它总是Z
):
String example = "20180531_132001Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmssX");
OffsetDateTime dateTime = OffsetDateTime.parse(example, formatter);
System.out.println(dateTime); // look ma, no hardcoded UTC
将打印:
2018-05-31T13:20:01Z
附加值是您的代码自动支持时区(例如"20180531_132001+05"
)。
符合 JDBC 4.2 的驱动程序可能能够通过调用直接处理 java.time 类型setObject
。
对于较旧的 JDBC 驱动程序,您可以转换dateTime
为 ajava.sql.Timestamp
或java.util.Date
:
java.sql.Timestamp.from(dateTime.toInstant());
java.util.Date.from(dateTime.toInstant());
1几乎总是存在一些在其中运行的上下文。LocalDateTime
例如“ KL1302 航班明天 13:20 抵达 X 机场”。这里“明天13:20 ”的上下文是机场X的当地时间;可以通过查看X所在的时区来确定。
推荐阅读
- c# - 将 UTC 日期字符串转换为本地日期时间
- windows-installer - 在另一个 msp 上安装 msp 不起作用
- flutter - Nullaware 运算符似乎在 Text 小部件中不起作用?
- python - PyQt5 中 QLabel 的 FontSize 动画
- java - 如何@SQLDelete、软删除、带有复合键的实体
- android - FCM 测试通知由设备接收,但公共设备不接收
- java - Spring book 抛出 Field postRepository in required 一个找不到的“repository.PostRepository”类型的bean
- vue.js - 使用 laravel-mix 构建 SCSS 设置
- azure-devops - 批处理文件如何设置构建任务错误?
- python - 最大长度和每个元素最大重复值的组合