Java 其中是从JDBC ResultSet中以字符串形式读取日期时指定的日期格式

Java 其中是从JDBC ResultSet中以字符串形式读取日期时指定的日期格式,java,jdbc,Java,Jdbc,这与问题完全相同,但这个问题实际上从未得到这样的回答;人们只是提供了编写代码的替代方法 我特别想问的是,是否有人知道默认转换格式是在哪里指定的,它是由某个JDBC规范定义的,还是由单个JDBC驱动程序定义的。如果是后者,那么另一个问题是Oracle 10g JDBC是如何做到这一点的 **1月15日增加: 对不起,我认为这个问题很清楚,但显然不是。我并没有试图从数据库中检索日期值,也不需要对检索方法提出建议 我不认为这是一个重复的参考问题,这就是为什么我在这里问一个单独的问题。虽然标题基本相同,

这与问题完全相同,但这个问题实际上从未得到这样的回答;人们只是提供了编写代码的替代方法

我特别想问的是,是否有人知道默认转换格式是在哪里指定的,它是由某个JDBC规范定义的,还是由单个JDBC驱动程序定义的。如果是后者,那么另一个问题是Oracle 10g JDBC是如何做到这一点的

**1月15日增加:

对不起,我认为这个问题很清楚,但显然不是。我并没有试图从数据库中检索日期值,也不需要对检索方法提出建议

我不认为这是一个重复的参考问题,这就是为什么我在这里问一个单独的问题。虽然标题基本相同,但引用的问题(无论OP的目的是什么)已经用从数据库检索日期值的替代方法得到了回答,这不是我希望知道的


干杯,

Oracle 10g JDBC是封闭源代码的,所以我想我们永远也不会知道:)但我打赌它首先会向服务器询问区域设置信息,并根据服务器设置调整它将使用的内部数据格式。我的2c。

我不能100%确定所有数据库的SQL日期类型实现。但从的javadoc来看,Oracle DB的
DATE
似乎可以轻松地转换为
java.sql.DATE
。对于和也是如此:SQL DATE可以转换为
java.SQL.DATE

好的,因此通过跟踪JDBC代码,看起来Oracle驱动程序硬编码了自己的格式:

  int k = (((bytes[0 + j] & 255) - 100) * 100 + (bytes[1 + j] & 255)) - 100;
  String s = k + "-" + toStr(bytes[2 + j])
      + "-" + toStr(bytes[3 + j])
      + " " + toStr(bytes[4 + j] - 1)
      + ":" + toStr(bytes[5 + j] - 1)
      + ":" + toStr(bytes[6 + j] - 1)
      + ".0";
所以从这个,我猜:

  • 这种行为在任何JDBC规范中都没有指定
  • 每个驱动程序库可以返回它喜欢的任何格式
  • 我假设这些是因为不同的实现返回不同的格式。当然,这种格式仍然有可能在JDBC规范中的某个地方强制使用,并且有些实现是不一致的,但这似乎不太可能。我当然在JDBC规范中找不到任何对这一点的引用(但这并不意味着它们不存在!)


    然而,就我而言,关键的一点是,格式在库中是硬编码的,不可被任何环境或其他设置覆盖,而且只要驱动程序库版本保持不变,就不会在不同系统之间更改。

    为什么需要将日期作为字符串读取??你想以后再计算吗??比如比较、子字符串等。你可能没有抓住另一个问题答案的重点……重点是你的问题没有意义。您应该通过该方法请求java.sql.Date对象,而不是请求字符串。JDBC驱动程序的目的就是在数据库引擎和Java应用程序之间进行调解,将本机定义的值转换为通用Java对象。对于日期时间值,每个JDBC驱动程序的任务是为您提供java.sql.date对象。从那里你可以创建任何你想要的字符串渲染。可能是@Basil的副本,谢谢你,但我觉得可能是你没有抓住重点,并且可能对我试图实现的目标做出了无效的假设。这个问题很有道理:有一些代码可以将数据库日期值转换为字符串;我只是想知道它是如何决定使用哪种格式的,不多不少。这不是你想听到的,但似乎应该有一个指向它的Java的链接:没有什么是真正的封闭源代码:)