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 dotyczący before() określa ścisłe porównanie i (b) jeśli nie jest równy, datownik, ponieważ ma nanosekundy, może sam 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ływanie przed() lub po() datowniku i podaniem argumentu Timestamp ma nieoczekiwane wyniki.java.sql.Timestamp utworzone z java.util.Date, dlaczego zawsze przed() to?
Poniższy przykładowy kod ma dwie instancje Date i one Timestamp, wszystkie z tą samą wartością milisekundy. Jednak porównanie daty z datownikiem pokazuje datę, która ma być po() Znacznik 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
Ostatni wiersz jest ciekawa.
Dziękuję.
Użyj debuggera, aby wskazać, że. I przypomnij [Timestamp API] (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...] zaleca się, aby kod nie wyświetlał wartości datownika ogólnie jako instancja java.util.Date. "* – Kai
' d1.compareTo (ts); 'wyniki' 1', wskazujące, że istnieje różnica 1 nano lub coś podobnego. ___ Uważam, że to błąd, tak. Niezła robota! – XenoRo