java.sql.Timestamp, созданный из java.util.Date, почему всегда перед () это?
После ошибки ямы заметили, что если я создаю java.sql.Timestamp из java.util.Date, используя конструктор, который занимает миллисекунды, экземпляр Date всегда после () Timestamp. Это озадачивает, так как (a) контракт для before () определяет строгое сравнение и (b) если он не равен, отметка времени, поскольку она имеет наносекунды, сама может быть после () Date. Но результаты противоположны и повторяемы (с JDK 1.6 и 1.7, с разными часовыми поясами JVM). Сравнение двух дат работает правильно, но вызов метода before () или after () для Date и предоставление аргумента Timestamp приводит к неожиданным результатам.
В приведенном ниже примере кода есть два экземпляра Date и одна отметка времени, причем все они имеют одинаковое значение в миллисекундах. Тем не менее, сравнение даты с меткой времени показывает дату после () метки времени.
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?
}
}
Пример вывода:
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
Последняя строка - любопытная.
Спасибо.