Question: ```
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.

Answer: 
`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.

```java
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`.
`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.