Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中日期对象的比较_Java_Date_Equals_Compareto - Fatal编程技术网

Java中日期对象的比较

Java中日期对象的比较,java,date,equals,compareto,Java,Date,Equals,Compareto,我最近观察到一个奇怪的现象,当用equals()比较两个Java日期对象时。请注意,this.getDate()和other.getDate()都将在我的应用程序中返回Java日期对象 代码: logger.debug("Date 1: " + this.getDate().toString()); logger.debug("Date 1: " + this.getDate().getTime()); logger.debug("Date 2: " + other.getDate().toS

我最近观察到一个奇怪的现象,当用equals()比较两个Java日期对象时。请注意,this.getDate()和other.getDate()都将在我的应用程序中返回Java日期对象

代码:

logger.debug("Date 1: " + this.getDate().toString());
logger.debug("Date 1: " + this.getDate().getTime());

logger.debug("Date 2: " + other.getDate().toString());
logger.debug("Date 2: " + other.getDate().getTime());

logger.debug("Dates are equal: " + this.getDate().equals(other.getDate()));
logger.debug("Dates match in comparison: " + (this.getDate().compareTo(other.getDate()) == 0));
输出:(添加空行以提高可读性)

有两件事我不明白:

  • 为什么equals()返回false
  • 为什么toString()的返回值会更改其格式
  • 我查阅了文件,上面写着:

    比较两个日期是否相等。当且仅当 参数不为null,并且是表示相同参数的日期对象 时间点,以毫秒为单位,作为此对象

    因此,当且仅当getTime方法 为两个返回相同的长值

    我还研究了Date.equals()的实现:

    那么为什么
    equals()
    返回false,即使
    getTime()
    为两个
    Date
    对象返回1406498400000

    参考:

    我想它们不是两个日期对象,因为格式不同

    java.sql.Timestamp扩展了java.util.Date,但它是另一个类,并且不相等

    从时间戳

    public boolean equals(java.lang.Object ts) {
      if (ts instanceof Timestamp) {
        return this.equals((Timestamp)ts);
      } else {
        return false;
      }
    }
    
    您可能会发现,如果从另一个角度进行比较,则返回trueP

    试一试


    从toString输出

    很明显,Date1是类java.sql.Date的对象 Date2是java.util.Date的对象

    因此toString的输出是不同的,equals()方法给出的是false


    因为(obj instanceof Date)将返回false。

    虽然我不知道为什么equals()返回false,但您始终可以切换并使用它来比较日期(我还没有看到这个方法失败!)toString不会更改格式,Date没有格式的概念,它只是一个毫秒数的容器。toString,ethos simple使用当前本地显示此值的表示形式。您是否可以更新示例以包含
    Date()
    对象的构造?因为.equals()比较对象,而.compare()比较字符串表明
    getDate
    方法并没有完成预期的操作。我想我们应该看看。这可能就是原因。看到每个类的
    toString()
    方法的文档,
    this.getDate()
    可能返回
    java.util.Date
    ,而
    other.getDate()
    返回
    java.sql.Date
    谢谢Peter,你搞定了!日期1是instanceof
    java.sql.Timestamp
    (和instanceof
    java.util.Date
    )。Date 2是
    java.util.Date
    的实例。啊,不,
    java.sql.Date
    是(
    instanceof
    java.util.Date
    java.sql.Date
    java.util.Date
    扩展而来。事实上,唯一失败的比较是
    Timestamp#equals(Date)
    ,因为匹配的对象不是
    Timestamp
    的实例……感谢您的响应!
    public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }
    
    public boolean equals(java.lang.Object ts) {
      if (ts instanceof Timestamp) {
        return this.equals((Timestamp)ts);
      } else {
        return false;
      }
    }
    
    logger.debug("Dates are equal: " + other.getDate().equals(this.getDate()));