【问题标题】:I'm unable to understand the documentation for java.sql.date我无法理解 java.sql.date 的文档
【发布时间】:2011-10-23 23:34:23
【问题描述】:

我正在努力解决跨 SQL、jdbc、JVM 和 linux 的时区问题。

我可以看到我需要交给/从 jdbc 获取的类是 java.sql.date。所以我阅读了文档,但什么也做不了。

据我了解,java.util.Data 和 java.sql.date 自 epoch 以来都保持数毫秒。

当我查看 java.sql.date 构造函数的定义时,它说

"使用给定的毫秒时间值构造一个Date对象。如果给定的毫秒值包含时间信息,驱动程序会将时间组件设置为默认时区的时间(Java虚拟机运行的时区)应用程序)对应于 0 GMT。”

好的-问题1-“如果给定的毫秒值包含时间信息”的含义是什么-显然它包含一些时间信息!

他们的意思是“如果你给例程的毫秒数不代表确切的日期边界,考虑到闰秒等”??这听起来是一个相当随机的测试来满足/失败!

或者他们的意思是“看在上帝的份上,在中午附近给我们一些东西,我们会将它截断到有问题的一天的开始?

问题 2 - 换句话说,这个奇怪的子句“FOR”是什么?这显然是为了使某些齿轮正确啮合的行为——但它们是什么齿轮?

【问题讨论】:

    标签: java date jdbc time


    【解决方案1】:

    java.sql.Datejava.sql.Timejava.sql.Timestamp 全部扩展 java.util.Date,但是:

    • java.sql.Date 的毫秒数四舍五入到午夜 - 这是一个“时间为零的日期”
    • java.sql.Time 的毫秒数少于 24 小时 - 就像 java.util.Date 上的 1970-01-01
    • java.sql.Timestamp 有完整的日期和时间 - 就像普通的 java.util.Date

    【讨论】:

    • 从表面上看,您的回答似乎与已发布的文档相矛盾。这就是说“驱动程序会将时间组件设置为默认时区(运行应用程序的 Java 虚拟机的时区)中对应于零 GMT 的时间”我想这可能意味着包含的值将始终是午夜格林威治标准时间在某一天或其他时间 - 虽然这是一种非常笨拙的说法。
    • 如果它的意思是说“java.sql.Date 对象在某天或其他天总是包含格林威治标准时间的午夜”,那么这只适用于已知的闰秒数。创建对象时的 JVM。如果闰秒信息稍后更新,同一时刻可以向后移动到前一天!!!
    【解决方案2】:

    如果我是你,我会避免使用毫秒构造函数。请改用Date.valueOf

    【讨论】:

    • 但 java.sql.Date 只有一个毫秒构造函数——另一个已弃用。哦 - 我明白了 - 使用零毫秒值构造它,然后使用 valueOf 方法在其中安装一个时刻 - 嗯,这可能让我消除疑虑。我需要查看“JDBC日期转义格式”的规范
    • 好的——这个花哨的短语似乎意味着“以 yyyy-mm-dd 格式表示日期”——这很容易。我假设结果代表 UTC 的午夜 - 或者是我想知道的 JVM 默认时区的午夜。
    • Right - II 看到静态 valueOf 方法是一个伪构造函数......就像其他东西的 instanceOf 一样。 TVM
    【解决方案3】:

    java.sql.Date 仅代表日期,其中没有任何时间信息。 java.sql.Time 应该暂时使用。

    【讨论】:

    • 感谢 Nivas - 但我认为您的意思必须是“仅以 UTC 表示的日期,包括创建时已知的闰秒”???
    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多