我想将时间戳转换为给定时区参数的字符串(在 Java 中)。从我在内部查看的代码来看,时间戳具有纳秒精度(或者至少可以将其转换为纳秒,我不在乎,因为我想要生成的输出格式不是那么精确)。
DateFormat 允许使用 S 说明符并应用 TimeZone,但它似乎只支持 3 位数字(毫秒?)精度。使用 toString 可以在秒(微秒?)内提供 6 位精度,但似乎没有使用 TimeZone 参数。
我需要一个既能实现这两个功能,又允许时区说明符并在一秒内提供 6 位精度的东西。
用什么?
最佳答案
我假设您指的是从 SQL 数据库获取的 java.sql.Timestamp
,其中它是带时区或不带时区的时间戳。
使用java.time
首先,你不需要那个。 Timestamp
类设计不佳且早已过时。相反,更喜欢从您的数据库中获取:
- 如果您的数据库列是一个
带有时区的时间戳
(它应该是这样),那么获取一个OffsetDateTime
(对于某些 JDBC 驱动程序,Instant
也适用)。 - 如果您的数据库列是不带时区的
timestamp
(不推荐),则获取LocalDateTime
。这样做的问题是LocalDateTime
是没有时区的日期和时间,因此不是唯一的时间点,因此不适合时间戳。
所提到的类型均来自现代 Java 日期和时间 API java.time,并且它们都具有纳秒精度。
示例:
OffsetDateTime odt = yourResultSet.getObject("my_timestamp_col", OffsetDateTime.class);
System.out.println(odt);
示例输出:
2018-11-29T22:34:56.123456789Z
输出中的尾随 Z
表示祖鲁时区、UTC 或偏移量零。
您想要应用给定的时区。例如:
ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("America/Guyana"));
System.out.println(zdt);
2018-11-29T18:34:56.123456789-04:00[America/Guyana]
使用 ResultSet.getObject
从结果集中获取 java.time 类型需要 JDBC 4.2(或现代 JPA 实现或用于数据访问的实现)。我们大多数人都有这个。
处理来自旧 API 的时间戳
如果您还没有 JDBC 4.2,或者您正在从旧版 API 获取 Timestamp
,而您现在无法承担更改的费用:
ZonedDateTime zdt = yourTimestamp.toInstant()
.atZone(ZoneId.of("America/Guyana"));
如果您对字符串输出有特定要求,请使用 DateTimeFormatter
来格式化 ZonedDateTime
。这个很多地方都有描述,搜索一下就可以了。
链接
Oracle tutorial: Date Time 解释如何使用 java.time。
关于java - 如何将java时间戳转换为符合纳秒分辨率的时区的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899034/