java.sql.Timestamp créé à partir de java.util.Date, pourquoi toujours avant (), il?
À la suite d'un bug, j'ai remarqué que si je créer un projet java.sql.Timestamp à partir d'une java.util.Date, en utilisant le constructeur qui prend le millisecondes, la Date de l'instance est toujours après() l'Horodatage. C'est étonnant, car (a) le contrat pour l'avant() spécifie une comparaison stricte et (b) si pas égal, l'Horodatage, parce qu'il a nanosecondes, peut-être lui-même après l'() de la Date. Mais les résultats sont à l'opposé et reproductibles (avec JDK 1.6 et 1.7, avec différentes JVM fuseaux horaires). La comparaison des deux Dates fonctionne correctement, mais en l'appelant avant() ou après() à une Date et en donnant un Timestamp argument a des résultats inattendus.
L'exemple de code ci-dessous a deux Jour et un Horodatage de l'instance, tous avec la même valeur en millisecondes. Pourtant, la comparaison d'une Date avec un Horodateur indique la Date (après) l'Horodatage.
import java.util.Date;
import java.sql.Timestamp;
public class X extends Date {
public static void main(String[] args) {
Date d1 = new Date();
Date d2 = new Date(d1.getTime());
Timestamp t = new Timestamp (d1.getTime());
System.out.println ("date1 = " + d1 + " (" + d1.getTime() + ")" );
System.out.println ("date2 = " + d2 + " (" + d2.getTime() + ")" );
System.out.println ("timestamp = " + t + " (" + t.getTime() + ")" );
System.out.println ("d1 before d2: " + d1.before(d2));
System.out.println ("d1 after d2: " + d1.after(d2));
System.out.println ("d1 before ts: " + d1.before(t));
System.out.println ("d1 after ts: " + d1.after(t)); //why true?
}
}
Exemple de sortie:
C:\>\Java\jdk1.7.0_05\bin\java X
date1 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
date2 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
timestamp = 2012-10-30 10:15:59.812 (1351606559812)
d1 before d2: false
d1 after d2: false
d1 before ts: false
d1 after ts: true
La dernière ligne est la curieuse.
Merci.
- Utiliser le débogueur de le signaler. Et de rappeler le Horodatage de l'API "[...] il est recommandé que le code ne pas afficher les valeurs d'Horodatage génériquement comme une instance de java.util.Date."
d1.compareTo(ts);
résultats1
, indiquant la présence d'un 1 nano différence ou quelque chose de goûts. ___ Je crois que c'est un bug, oui. Beau travail de le trouver!- Pour info, le terriblement gênant de longue date du temps des classes comme
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.de temps les classes intégré dans Java 8 et les versions ultérieures. Voir Tutoriel Oracle.
Vous devez vous connecter pour publier un commentaire.
Si vous regardez à l'intérieur de la représentation et ce qui est comparé, dans le
after()
méthode, vous voyez que, par exemple, pourvous obtenez un
Date
avecet un
Timestamp
avecPuisque tout ce qui est comparé à la
fastTime
partie, vous obtenez votre comportement observé.Comme @user714965 points ci-dessus, vous n'êtes pas censé traiter un
Timestamp
comme unDate
.La documentation de l'API de
java.sql.Timestamp
dit:(Qui est d'accord avec Keppil de réponse).
Il dit aussi:
Cela signifie que vous ne devriez pas traiter
Timestamp
comme unjava.util.Date
, qui est ce que vous faites si vous le passez àjava.util.Date.after()
(cette méthode attend unjava.util.Date
- vous êtes de passage dans unTimestamp
, de la traiter comme si c'est unjava.util.Date
, qui à ce commentaire dit que vous ne devriez pas le faire).C'est bien sûr une mauvaise conception de la Java standard de la bibliothèque. Si vous avez besoin de travailler avec des dates et des heures, utilisez Joda Time, beaucoup mieux conçu et le plus puissant de la bibliothèque.
java.sql.Timestamp
, vous pouvez le trouver dans le fichiersrc.zip
qui est dans votre répertoire d'installation du JDK.