Nach einem Fehler habe ich festgestellt, dass, wenn ich einen java.sql.Timestamp aus einer java.util.Date mit dem Konstruktor erzeuge, der die Millisekunden dauert, die Date-Instanz immer nach() dem Timestamp ist. Dies ist rätselhaft, da (a) der Vertrag für vor() einen strikten Vergleich angibt und (b) wenn nicht gleich, der Zeitstempel, da er Nanosekunden hat, selbst nach() dem Datum sein könnte. Aber die Ergebnisse sind entgegengesetzt und wiederholbar (mit JDK 1.6 und 1.7, mit verschiedenen JVM-Zeitzonen). Das Vergleichen von zwei Daten funktioniert ordnungsgemäß, aber das Aufrufen von before() oder after() für ein Date und das Geben eines Timestamp-Arguments führt zu unerwarteten Ergebnissen.java.sql.Timestamp erstellt von java.util.Date, warum immer vor() es?
Der folgende Beispielcode enthält zwei Date- und eine Timestamp-Instanz, alle mit demselben Millisekundenwert. Das Vergleichen eines Datums mit einem Zeitstempel zeigt jedoch das Datum an, das nach() dem Zeitstempel sein soll.
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?
}
}
Beispielausgabe:
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
Die letzte Zeile ist die Neugierigen ein.
Vielen Dank.
Verwenden Sie den Debugger, um darauf hinzuweisen. Und erinnern Sie sich an die [Timestamp API] (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...] es wird empfohlen, dass der Code Timestamp-Werte nicht anzeigt generisch als Instanz von java.util.Date. "* – Kai
' d1.compareTo (ts); 'results' 1', was darauf hinweist, dass es einen Unterschied von 1 Nano oder etwas ähnliches gibt. ___ Ich glaube, es ist ein Fehler, ja. Nette Arbeit, es zu finden! – XenoRo