gpt4 book ai didi

java - 如何将java时间戳转换为符合纳秒分辨率的时区的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:36 29 4
gpt4 key购买 nike

我想将时间戳转换为给定时区参数的字符串(在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com