Java中日期对象的比较
我最近观察到一个奇怪的现象,当用equals()比较两个Java日期对象时。请注意,this.getDate()和other.getDate()都将在我的应用程序中返回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
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,即使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是instanceofjava.sql.Timestamp
(和instanceofjava.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()));