java.sql.Timestamp creado a partir de java.util.Date, ¿por qué siempre antes ()?

Después de un error, he notado que si creo un java.sql.Timestamp a partir de un java.util.Date, usando el constructor que toma los milisegundos, la instancia de la Fecha siempre es posterior a () la marca de tiempo. Esto es desconcertante, ya que (a) el contrato para antes () especifica una comparación estricta y (b) si no es igual, la marca de tiempo, porque tiene nanosegundos, podría estar después de () la fecha. Pero los resultados son opuestos y repetibles (con JDK 1.6 y 1.7, con diferentes zonas horarias JVM). Comparar dos fechas funciona correctamente, pero llamar antes () o después () en una fecha y dar un argumento de marca de tiempo tiene resultados inesperados.

El código de ejemplo siguiente tiene dos instancias de Fecha y una Marca de hora, todas ellas con el mismo valor de milisegundos. Sin embargo, la comparación de una Fecha con una marca de tiempo muestra que la Fecha debe ser posterior a () la marca de tiempo.

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

Salida de muestra:

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 última línea es la curiosa.

Gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta