Yo !

Petit message pour un probleme surprenant que j'ai rencontré ce matin.
Comme annoncé dans le titre, j'ai 2 objets Date qui sont à priori identiques, mais dont la comparaison ne donne pas le meme resultat selon que je compare a à b ou b à a.

Plus simplement, dans mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
obj1.getCreated().equals(obj2.getCreated())
renvoie true
Code : Sélectionner tout - Visualiser dans une fenêtre à part
obj2.getCreated().equals(obj1.getCreated())
renvoie false

Trouvant ceci surprenant j'ai regardé comment fonctionnait la méthode equals de date :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }
Puis j'ai fait des tests qui ont donné les resultats suivants :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
obj1.getCreated() : Fri May 29 11:40:45 CEST 2009
obj2.getCreated() : 2009-05-29 11:40:45.929
obj1.getCreated().getTime() : 1243590045929
obj2.getCreated().getTime() : 1243590045929
obj1.getCreated().equals(obj2.getCreated()) : true
obj2.getCreated().equals(obj1.getCreated()) : false
obj1.getCreated() instanceof Date && obj2.getCreated().getTime() == obj1.getCreated().getTime() : true
obj2.getCreated() instanceof Date && obj1.getCreated().getTime() == obj2.getCreated().getTime() : true
Ok toString renvoie un resultat différent mais à priori les elements pris en compte dans la comparaison à savoir le temps en millisecondes sont egaux.

Y'a un truc qui m'echappe je crois.