java.sql.Timestamp时区特定吗?

java.sql.Timestamp时区特定吗?,第1张

java.sql.Timestamp时区特定吗?

尽管未明确为

setTimestamp(int parameterIndex, Timestamp x)
驱动程序指定驱动程序,但必须遵循
setTimestamp(int parameterIndex, Timestamp x, Calendar cal)javadoc
建立的规则:

java.sql.Timestamp
使用给定的
Calendar
对象将指定的参数设置为给定的值。驱动程序使用该
Calendar
对象构造一个
SQL TIMESTAMP
值,然后将其发送到数据库。使用
Calendar
对象,驾驶员可以考虑自定义时区来计算时间戳。如果未
Calendar
指定任何对象,则驱动程序将使用默认时区,即运行应用程序的虚拟机的默认时区。

当你使用

setTimestamp(int parameterIndex, Timestamp x)
JDBC驱动程序进行调用时,将使用虚拟机的时区来计算该时区中时间戳的日期和时间。此日期和时间就是存储在数据库中的日期和时间,如果数据库列未存储时区信息,则有关该时区的所有信息都会丢失(这取决于使用数据库的应用程序是否可以使用时区信息)。一致的时区或提出另一种方案来识别时区(即存储在单独的列中)。

例如:你的当地时区是GMT + 2。你存储“ 2012-12-25 10:00:00 UTC”。存储在数据库中的实际值为“ 2012-12-25 12:00:00”。你再次检索它:你以“ 2012-12-25 10:00:00 UTC”再次获得它(但仅当使用检索时才如此

getTimestamp(..)
),但是当另一个应用程序在时区GMT + 0访问数据库时,它将检索时间戳为“ 2012-12-25 12:00:00 UTC”。

如果要将其存储在其他时区,则需要

setTimestamp(int parameterIndex
,
Timestamp x
,
Calendar cal)
在所需时区中将其与
Calendar
实例一起使用。只需确保在检索值时也使用具有相同时区的等效getter(如果TIMESTAMP在数据库中使用不带时区的信息)。

因此,假设你要存储实际的GMT时区,则需要使用:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));stmt.setTimestamp(11, tsSchedStartTime, cal);

与JDBC 4.2兼容的驱动程序应该支持

java.time.LocalDateTime
(和
java.time.LocalTime
)为TIMESTAMP(和TIME)通过
get/set/updateObject
。这些
java.time.Local*
类没有时区,因此不需要应用任何转换(尽管如果你的代码确实采用了特定的时区,则可能会带来一系列新的问题)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5040778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存