gpt4 book ai didi

java - 任何人都可以解释 jdbc resultset getTimestamp(int,calendar) 的用例吗?

转载 作者:行者123 更新时间:2023-11-29 05:12:41 25 4
gpt4 key购买 nike

我说的是这个接口(interface)方法:

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getTimestamp%28int,%20java.util.Calendar%29

最常用的实现是缓存行集中的实现:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/com/sun/rowset/CachedRowSetImpl.java第 6170 行

您会注意到该实现做了两件非常奇怪的事情:

1) 它修改作为参数传递的日历,即使也有返回值

2) 它从 SQL 中提取所有时间信息,除了毫秒,它来自作为参数传递的日历。

接口(interface)描述相当不清楚,但假设实现是正确的——这个方法有什么意义?我可以理解一种方法,它需要一个日历来提取时区,而不修改它。但是拿一个日历,修改它,不仅提取区域而且提取毫秒......

有人对此 API 背后的历史/设计/推理有任何见解吗?

最佳答案

这似乎是对 JDBC API 文档的错误解释(不幸的是 javax.sql.rowset 有更多这样的错误解释)。

默认情况下,JDBC 驱动程序需要存储或检索时间或时间戳,就好像数据库中存储的时间在 JVM 的当前时区中一样。因为这并不总是你想要的,API 提供了提供 Calendar 对象的方法,你需要使用它来派生要使用的实际时区(我不知道他们为什么不这样做请改用 java.util.TimeZone)。

这在 PreparedStatement.setTimeStamp 中指定:

With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

ResultSet 中的方法 getTimestamp 遵循(或应该遵循)这些相同的规则。

因此,如果数据库存储时间“11:20”并且您的本地时区是 CET (UTC+1),则检索到的时间是 10:20 UTC (11:20 CET)。但是,如果我在 GMT 中提供 Calendar,返回的时间应该是 11:20 UTC(12:20 CET)。

关于java - 任何人都可以解释 jdbc resultset getTimestamp(int,calendar) 的用例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27817383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com