java.sql.Timestamp criado a partir de java.util.Date, porque sempre antes () é?
Após um bug, notei que, se eu criar um java.sql.Timestamp de um java.util.Date, usando o construtor que leva milissegundos, a instância Date será sempre depois de () o Timestamp. Isso é intrigante, uma vez que (a) o contrato para before () especifica uma comparação estrita e (b) se não for igual, o registro de data e hora, porque ele tem nanossegundos, pode ser depois () da Data. Mas os resultados são opostos e repetíveis (com o JDK 1.6 e 1.7, com diferentes fusos horários da JVM). Comparar duas datas funciona corretamente, mas chamar before () ou after () em uma data e dar um argumento de carimbo de data / hora tem resultados inesperados.
O código de exemplo abaixo possui duas ocorrências de data e uma marca de data e hora, todas com o mesmo valor de milissegundos. No entanto, comparar uma data com um carimbo de data / hora mostra a data a ser após () o carimbo de data / hora.
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?
}
}
Amostra de saída:
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
A última linha é a curiosa.
Obrigado.