【问题标题】:java.sql.Timestamp comparison bug? [duplicate]java.sql.Timestamp 比较错误? [复制]
【发布时间】:2013-03-26 04:07:43
【问题描述】:

您好,我有一个这样的代码 sn-p:

Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));

输出如下:

Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false

这个 java.sql.Timestamp 类有什么问题?

是的,我看过这个:

注意:此类型是 java.util.Date 和单独的纳秒值的组合。只有整数秒存储在 java.util.Date 组件中。小数秒 - 纳秒 - 是分开的。 Timestamp.equals(Object) 方法在传递 java.util.Date 类型的值时永远不会返回 true,因为日期的 nanos 组件是未知的。因此,Timestamp.equals(Object) 方法相对于 java.util.Date.equals(Object) 方法不是对称的。此外,hashcode 方法使用底层 java.util.Date 实现,因此在其计算中不包括 nanos。

由于上面提到的 Timestamp 类和 java.util.Date 类之间的差异,建议代码不要将 Timestamp 值一般视为 java.util.Date 的实例。 Timestamp 和 java.util.Date 的继承关系实际上是实现继承,而不是类型继承。

但它是用于日期 时间戳关系。

在我的示例中,我只有时间戳,但行为仍然出乎意料..

更新:答案

发生这种情况的原因是before() 方法被重载,而不是在java.sql.Timestamp 中被覆盖。 我期待一个“覆盖”的行为。 比较时间戳的正确方法是使用时间戳变量,而不是日期。

这在 Java 核心中仍然是一个糟糕的设计决策,因为继承应该意味着 Timestamp is-a Date,没有惩罚和例外......

【问题讨论】:

  • 我相信我在另一篇文章中发现了问题。请review。问题是您不应该将TimeStamp 视为日期。

标签: java comparison timestamp


【解决方案1】:

尝试使用Timestamp 而不是Date,它会起作用。

Timestamp d1 = new java.sql.Timestamp(new Date().getTime());

TimestampDate 都有自己的方法before 的实现。检查一下。

【讨论】:

    【解决方案2】:

    嗯,这似乎是一个记录不足的功能。

    Timestampbeforeafter 方法似乎可以比较到第二个,但没有考虑毫秒部分。尝试运行它,直到 TimeStamp 落入不同的秒数并且比较按预期进行(将睡眠增加到 500 以使其更容易)。

    顺便说一句,compareTo 方法考虑了毫秒,所以你可以改用它。

    【讨论】:

      【解决方案3】:

      如果你调用方法Timestamp.before(Timestamp),你会得到预期的结果。

      但显然使用Timestamp 作为Date 将是一团糟。您必须静态Timestamp用作Timestamp

      【讨论】:

        【解决方案4】:

        这里提到

        timestamp is a thin wrapper

        时间戳只是增加了保存 SQL TIMESTAMP 小数秒值的能力(在您的案例中出现问题的精度为纳秒)

        【讨论】:

          猜你喜欢
          • 2021-05-03
          • 2017-10-08
          • 1970-01-01
          • 2012-11-30
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          • 2014-07-13
          相关资源
          最近更新 更多