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ésultats 1, 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, et java.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.
InformationsquelleAutor After Sandy | 2012-10-30