java.sql.Timestamp criado a partir de java.util.Date, porque sempre antes () é?

Após um bug, notei que, se eu criar um java.sql.Timestamp de um java.util.Date, usando o construtor que leva milissegundos, a instância Date será sempre depois de () o Timestamp. Isso é intrigante, uma vez que (a) o contrato para before () especifica uma comparação estrita e (b) se não for igual, o registro de data e hora, porque ele tem nanossegundos, pode ser depois () da Data. Mas os resultados são opostos e repetíveis (com o JDK 1.6 e 1.7, com diferentes fusos horários da JVM). Comparar duas datas funciona corretamente, mas chamar before () ou after () em uma data e dar um argumento de carimbo de data / hora tem resultados inesperados.

O código de exemplo abaixo possui duas ocorrências de data e uma marca de data e hora, todas com o mesmo valor de milissegundos. No entanto, comparar uma data com um carimbo de data / hora mostra a data a ser após () o carimbo de data / hora.

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?
    }
}

Amostra de saída:

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

A última linha é a curiosa.

Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion