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.