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

标签 java timestamp timezone tostring

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

相关文章:

初始化OpenSaml时java.lang.NoSuchMethodError : org. slf4j.helpers.Util.report(Ljava/lang/String;)V

java - 如何使用Web应用程序和Android应用程序处理Spring MVC后端的安全性?

python - sqlite - python 检索 CURRENT_TIMESTAMP 作为日期时间对象

python - 什么正则表达式匹配这种类型的时间戳

sql-server - 使用 AT TIME ZONE 获取指定时区的当前时间

Java如何获取给定时区缩写的时区ID列表

java - 如何在 JAVA 类中构建以下需求

java - Mac OSX - IllegalStateException : The driver is not executable:

java - 将时间戳排序为半小时 block

php - 在 php 中将本地日期、时间和时区值转换为 utc 时区