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

Последняя строка - любопытная.

Спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос