Reputation: 615
Foo a;
...
Date b = a.getDate();
Date c = new Date(b.getTime());
if (b.equals(c)) System.out.println("equal");
else System.out.println("not equal");
System.out.println(b.toString());
System.out.println(b.getTime());
System.out.println(c.toString());
System.out.println(c.getTime());
The above prints:
not equal
2011-07-23 22:24:21.834
1311459861834
Sat Jul 23 22:24:21
1311459861834
Why is this? Is this a bug in Date? Thats hard to believe.
Upvotes: 5
Views: 1416
Reputation: 12056
a.getDate()
obviously returns java.sql.Timestamp
java.sql.Timestamp
has different equals method than java.uti.Date
which is basically
return obj instanceof Date && getTime() == ((Date) obj).getTime();
Timestamp
however is more sophisticated and it requires the target to be Timestamp
too.
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);//the impl checks nanos too
} else {
return false;
}
You probably use Hibernate or something similar that persists java.util.Date
as Timestamp
.
Upvotes: 6
Reputation: 346347
This is only possible if a.getDate()
returns a subclass of Date
, such as java.sql.Date
.
Upvotes: 2
Reputation: 26713
a.getDate()
might not return java.util.Date
but something else, which extends it.
This would explain weird b.toString()
and b.equals(c)
behaviour.
Upvotes: 4