java.sql.Timestamp utworzony z java.util.Date, dlaczego zawsze przed () to?

Po błędzie zauważyłem, że jeśli utworzę java.sql.Timestamp z java.util.Date, używając konstruktora, który zajmuje milisekundy, instancja Date jest zawsze po () znaczniku czasu. Jest to zastanawiające, ponieważ (a) kontrakt na before () określa ścisłe porównanie i (b) jeśli nie jest równy, znacznik czasu, ponieważ ma nanosekundy, sam może być po () dacie. Ale wyniki są odwrotne i powtarzalne (z JDK 1.6 i 1.7, z różnymi strefami czasowymi JVM). Porównywanie dwóch dat działa poprawnie, ale wywołanie before () lub after () w Date i podanie argumentu Timestamp ma nieoczekiwane wyniki.

Poniższy przykładowy kod ma dwie instancję Date i jedną instancję Timestamp, wszystkie z tą samą wartością milisekundy. Jednak porównywanie daty z datownikiem pokazuje, że data ma być po () znaczniku czasu.

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

Przykładowe wyjście:

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

Ostatnia linia to ta ciekawa.

Dziękuję Ci.

questionAnswers(2)

yourAnswerToTheQuestion