【问题标题】:Can Java's sql.Date produce an off by one error?Java 的 sql.Date 会产生一个错误吗?
【发布时间】:2015-07-09 17:12:37
【问题描述】:

我有一个 Date 对象,它使用方法 getTime 返回自 1970 年 1 月 1 日以来的毫秒数。

invoiceDate.getTime();

这些毫秒被传递给java.sql.Date 构造函数,如下所示:

new java.sql.Date( invoiceDate.getTime() );

结果是yyyy-MM-dd格式的日期。

现在我的问题是,java.sql.Date 是否有可能产生一个错误?例如,假设 invoiceDate 设置为 Thu Jul 02 00:00:00 CDT 2015,那么 java.sql.Date 是否有可能产生 2015- 07-01

【问题讨论】:

  • 您是否有一些代码会产生 off by 1 错误?您为什么怀疑这可能?
  • 没有我可以看到的代码导致此问题。我工作的地方的 QA 声称发生了这种情况,但是,我无法重现假设的错误。

标签: java sql-server date


【解决方案1】:

没有。 Java 日期不存储时区,因此您的 invoiceDate 和新日期对象相等。它在 toString() 中打印 CDT,因为那是你的 jvm 的时区

另请参阅Date.getTime() 的文档

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数 由此 Date 对象表示。

对于Date(long)

分配一个 Date 对象并初始化它以表示指定的 自标准基准时间以来的毫秒数,称为“ 纪元”,即 1970 年 1 月 1 日 00:00:00 GMT。

【讨论】:

    【解决方案2】:

    没有。但是,它不关心时区,这可能会产生一些问题。另请注意,月份从零开始计数,而天从 1 开始计数。

    【讨论】:

      【解决方案3】:

      6ton 接受的答案是正确的。 java.util.Date 和 java.sql.Date 上的 toString 方法以静默方式将 JVM 的当前默认时区应用于 UTC 时区中的日期时间值

      java.time

      这是避免使用旧的 java.util.Date/.Calendar 和 java.sql.Date 的许多原因之一。尝试使用 Java 8 及更高版本中的新 java.time 框架或第 3 方 Joda-Time 库来完成大部分工作。

      如果您真的只关心没有时间的日期,这意味着您的应用永远不会离开一个地区(时区),那么请使用仅日期类。旧的日期时间类缺少这一点。 java.time 和 Joda-Time 都提供了这样一个仅限日期的类,都称为 LocalDate

      以这种方式使用LocalDate 已在 StackOverflow 上讨论过很多次。请搜索更多信息。


      实际上在 java.util.Date 源代码的深处分配了一个时区,但在大多数情况下它被忽略了。令人困惑?是的。然而,另一个理由避免使用这些旧课程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多