In seguito a un errore, ho notato che se creo un java.sql.Timestamp da un java.util.Date, utilizzando il costruttore che impiega i millisecondi, l'istanza Date è sempre successiva() al Timestamp. Questo è sconcertante, poiché (a) il contratto per before() specifica un confronto rigoroso e (b) se non è uguale, il Timestamp, poiché ha nanosecondi, potrebbe essere esso stesso dopo() la Data. Ma i risultati sono opposti e ripetibili (con JDK 1.6 e 1.7, con diversi fusi orari JVM). Il confronto di due date funziona correttamente, ma chiamare prima() o dopo() su una data e fornire un argomento Timestamp ha risultati imprevisti.java.sql.Timestamp creato da java.util.Date, perché sempre prima()?
Il seguente codice di esempio presenta due date e un'istanza di Timestamp, tutte con lo stesso valore in millisecondi. Tuttavia, confrontando una data con un timestamp, la data deve essere successiva() al timestamp.
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?
}
}
uscita Esempio:
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
L'ultima riga è il curioso.
Grazie.
Utilizzare il debugger per farlo notare. E ricorda l'API [Timestamp] (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...] si raccomanda che il codice non visualizzi i valori di Timestamp genericamente come un'istanza di java.util.Date. "* – Kai
' d1.compareTo (ts); 'results' 1', che indica che c'è una differenza di 1 nano o qualcosa del like. ___ Credo che sia un bug, sì. Bel lavoro a trovarlo! – XenoRo