如何将java时间戳转换为有关纳秒分辨率时区的字符串
我想将时间戳转换为给定时区参数的字符串(在Java中)。从我在内部看到的代码来看,时间戳具有纳秒精度(或者至少有人可以将其转换为纳秒,我不在乎,因为我想要生成的输出格式没有那么精确) DateFormat允许使用S说明符,并将应用时区,但它似乎只具有3位数(毫秒?)的精度。使用toString可以在秒(微秒?)内提供6位精度,但似乎不接受时区参数 我需要的东西,既可以做,允许时区说明符,并给出6位精度在一秒钟内如何将java时间戳转换为有关纳秒分辨率时区的字符串,java,timestamp,timezone,tostring,Java,Timestamp,Timezone,Tostring,我想将时间戳转换为给定时区参数的字符串(在Java中)。从我在内部看到的代码来看,时间戳具有纳秒精度(或者至少有人可以将其转换为纳秒,我不在乎,因为我想要生成的输出格式没有那么精确) DateFormat允许使用S说明符,并将应用时区,但它似乎只具有3位数(毫秒?)的精度。使用toString可以在秒(微秒?)内提供6位精度,但似乎不接受时区参数 我需要的东西,既可以做,允许时区说明符,并给出6位精度在一秒钟内 使用什么?我假设您指的是从sql数据库中获取的java.sql.Timestamp,
使用什么?我假设您指的是从sql数据库中获取的
java.sql.Timestamp
,该数据库中的时间戳有时区也有时区
使用java.time
首先,你不需要那个。Timestamp
类的设计很差,而且很早就过时了。相反,您更愿意从数据库中获取:
- 如果您的数据库列是一个带有时区的
时间戳,它应该是这样的,那么获得一个
(对于一些JDBC驱动程序,OffsetDateTime
也可以工作)即时
- 如果数据库列是不带时区的
(不推荐),则获取timestamp
。问题是,LocalDateTime
是一个没有时区的日期和时间,因此不是唯一的时间点,因此不适合使用时间戳LocalDateTime
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
类的设计很差,而且很早就过时了。相反,您更愿意从数据库中获取:
- 如果您的数据库列是一个带有时区的
时间戳,它应该是这样的,那么获得一个
(对于一些JDBC驱动程序,OffsetDateTime
也可以工作)即时
- 如果数据库列是不带时区的
(不推荐),则获取timestamp
。问题是,LocalDateTime
是一个没有时区的日期和时间,因此不是唯一的时间点,因此不适合使用时间戳LocalDateTime
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)的用法。非常感谢。