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

如何将java时间戳转换为有关纳秒分辨率时区的字符串,java,timestamp,timezone,tostring,Java,Timestamp,Timezone,Tostring,我想将时间戳转换为给定时区参数的字符串(在Java中)。从我在内部看到的代码来看,时间戳具有纳秒精度(或者至少有人可以将其转换为纳秒,我不在乎,因为我想要生成的输出格式没有那么精确) DateFormat允许使用S说明符,并将应用时区,但它似乎只具有3位数(毫秒?)的精度。使用toString可以在秒(微秒?)内提供6位精度,但似乎不接受时区参数 我需要的东西,既可以做,允许时区说明符,并给出6位精度在一秒钟内 使用什么?我假设您指的是从sql数据库中获取的java.sql.Timestamp,

我想将时间戳转换为给定时区参数的字符串(在Java中)。从我在内部看到的代码来看,时间戳具有纳秒精度(或者至少有人可以将其转换为纳秒,我不在乎,因为我想要生成的输出格式没有那么精确)

DateFormat允许使用S说明符,并将应用时区,但它似乎只具有3位数(毫秒?)的精度。使用toString可以在秒(微秒?)内提供6位精度,但似乎不接受时区参数

我需要的东西,既可以做,允许时区说明符,并给出6位精度在一秒钟内


使用什么?

我假设您指的是从sql数据库中获取的
java.sql.Timestamp
,该数据库中的时间戳有时区也有时区

使用java.time 首先,你不需要那个。
Timestamp
类的设计很差,而且很早就过时了。相反,您更愿意从数据库中获取:

  • 如果您的数据库列是一个带有时区的
    时间戳,它应该是这样的,那么获得一个
    OffsetDateTime
    (对于一些JDBC驱动程序,
    即时
    也可以工作)
  • 如果数据库列是不带时区的
    timestamp
    (不推荐),则获取
    LocalDateTime
    。问题是,
    LocalDateTime
    是一个没有时区的日期和时间,因此不是唯一的时间点,因此不适合使用时间戳
提到的类型都来自java.time,即现代java日期和时间API,它们都具有纳秒精度

例如:

    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[美国/圭亚那]

使用
ResultSet.getObject
从结果集中从java.time获取类型需要JDBC 4.2(或现代JPA实现或用于数据访问的实现)。我们大多数人都有

从遗留API处理时间戳 如果您还没有获得JDBC 4.2,或者您正在从一个您现在无法更改的遗留API获得
时间戳

    ZonedDateTime zdt = yourTimestamp.toInstant()
            .atZone(ZoneId.of("America/Guyana"));
如果您对字符串输出有特定要求,请使用
DateTimeFormatter
格式化
ZonedDateTime
。这在很多地方都有描述,只需搜索即可

链接
解释如何使用java.time.

我假设您指的是从sql数据库中获取的
java.sql.Timestamp
,该数据库中的时间戳有时区也有时区

使用java.time 首先,你不需要那个。
Timestamp
类的设计很差,而且很早就过时了。相反,您更愿意从数据库中获取:

  • 如果您的数据库列是一个带有时区的
    时间戳,它应该是这样的,那么获得一个
    OffsetDateTime
    (对于一些JDBC驱动程序,
    即时
    也可以工作)
  • 如果数据库列是不带时区的
    timestamp
    (不推荐),则获取
    LocalDateTime
    。问题是,
    LocalDateTime
    是一个没有时区的日期和时间,因此不是唯一的时间点,因此不适合使用时间戳
提到的类型都来自java.time,即现代java日期和时间API,它们都具有纳秒精度

例如:

    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[美国/圭亚那]

使用
ResultSet.getObject
从结果集中从java.time获取类型需要JDBC 4.2(或现代JPA实现或用于数据访问的实现)。我们大多数人都有

从遗留API处理时间戳 如果您还没有获得JDBC 4.2,或者您正在从一个您现在无法更改的遗留API获得
时间戳

    ZonedDateTime zdt = yourTimestamp.toInstant()
            .atZone(ZoneId.of("America/Guyana"));
如果您对字符串输出有特定要求,请使用
DateTimeFormatter
格式化
ZonedDateTime
。这在很多地方都有描述,只需搜索即可

链接
解释如何使用java.time。

阅读,也许它包含了有关您需求的有用信息。是的,这解释了我似乎需要的S(即SSS而不仅仅是S)的使用。谢谢。请阅读,也许它包含了有关您需求的有用信息。是的,这解释了我似乎需要的S(即SSS而不仅仅是S)的用法。非常感谢。