Java 有人能解释一下JDBCResultSet getTimestamp(int,calendar)的用例吗?

Java 有人能解释一下JDBCResultSet getTimestamp(int,calendar)的用例吗?,java,jdbc,resultset,cachedrowset,Java,Jdbc,Resultset,Cachedrowset,我说的是这个接口方法: 最常用的实现是cachedrowset中的实现: 第6170行 您会注意到,该实现做了两件非常奇怪的事情: 1) 它修改作为参数传递的日历,即使还有一个返回值 2) 它从SQL中提取所有时间信息,,但毫秒除外,毫秒来自作为参数传递的日历 接口描述相当不清楚,但假设实现是正确的-这种方法的意义是什么?我可以理解一种方法,它只需要一个日历来提取时区,而不需要修改它。但是拿一个日历,修改它,不仅提取区域,还提取毫秒 是否有人了解此API背后的历史/设计/推理?SQL数据库以年

我说的是这个接口方法:

最常用的实现是cachedrowset中的实现:

第6170行

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

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

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

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


是否有人了解此API背后的历史/设计/推理?

SQL数据库以年、月、日、小时分钟、秒等形式存储时间戳的日期和时间值。这些值指定的时间实例取决于解释它们的时区(例如,2014年1月1日15:00:00在欧洲的时间与美国的时间不同)。时区可能是时间戳的一部分,也可能不是时间戳的一部分,具体取决于列的类型

Java和类表示一个时间实例,而不考虑时区(或者更确切地说是固定的UTC时区)

如果SQL数据库中的列不存储时区信息和日期+时间,为了从这样的时间戳创建Java
date
TimeStamp
对象,需要时区,以便它可以在时间上指向特定实例(在参考UTC时区中)


所讨论的
ResultSet.getTimestamp()
方法可用于获取SQL时间戳数据,并使用参数
Calendar
对象中设置的时区信息将其转换为Java
timestamp
实例。

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

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

具体规定如下:

使用
Calendar
对象,驱动程序可以根据自定义时区计算时间戳。如果未指定
Calendar
对象,驱动程序将使用默认时区,即运行应用程序的虚拟机的时区

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


因此,如果数据库存储时间为“11:20”,而您的本地时区为CET(UTC+1),则检索到的时间为10:20 UTC(11:20 CET)。但是,如果我提供了GMT格式的
日历,则返回的时间应为11:20 UTC(12:20 CET)。

在我看来,实现此
CachedRowSet
的人不理解JDBC API(在
行集
的参考实现中有更多关于JDBC的好的误解)。据我所知,日历应该只用于其时区信息,但是API确实说“用于构造时间戳的java.util.Calendar对象”@MarkRotterVeel-是的,这就是我所想的-我想知道实现者是否被“为时间戳构造一个合适的毫秒值”这句话欺骗了-所以他们实际上是跨毫秒复制的…可怕的是,这个实现永远无法“修复”-这将打破人们一直使用的解决方法。据我所知-我实现了一个JDBC驱动程序-日历对象用于时区信息(默认情况下,JDBC驱动程序应使用JVM的当前时区,这可以从以下方面推断:“使用Calendar对象,驱动程序可以根据自定义时区计算时间戳。如果未指定Calendar对象,驱动程序将使用默认时区,即运行应用程序的虚拟机的时区。”我想我误解了javadoc,我编辑了我的帖子。