Java PreparedStatement使用时间戳时阅读本地时区.from(即时)

ogsagwnx  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(112)

我试图将UTC时间戳填充到SQL表中,但是当我使用Instant.now()获取当前UTC时间时,Timestamp.from(instant)的转换将本地时区写入表中。

PreparedStatement ps = connection.prepareStatement(...)
ps.setString(1, Timestamp.from(Instant.now())

这将导致本地时区与UTC相反。

svgewumm

svgewumm1#

当我使用www.example.com()获取当前UTC时间时,Instant.now() to get the current UTC time,
不要将Instant用于SQL数据库工作。
在JDBC 4.2+中,规范将OffsetDateTime类Map到与SQL标准类型TIMESTAMP WITH TIME ZONE类似的类型的列。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

InstantZonedDateTime在JDBC中都没有Map,SQL标准没有定义与这些类等效的类型。
顺便说一下,对于类型类似于SQL标准类型TIMESTAMP WITHOUT TIME ZONE的列,请使用LocalDateTime类。
时间戳的转换. from(instant)
永远不要使用Timestamp这样糟糕的遗留日期-时间类,只使用它们的替代品:JSR 310中定义的现代 * java. time * 类。
写入数据库:

myPreparedStatement.setObject … , odt ) ;

检索:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

您评论:
问题是我的JVM默认为本地时间
编写Java代码时,应该不考虑JVM当前的默认时区。
上面显示的代码不受JVM当前默认时区的影响。

相关问题