Sau một lỗi, tôi đã nhận thấy rằng nếu tôi tạo một java.sql.Timestamp từ một java.util.Date, bằng cách sử dụng hàm tạo mất mili giây, cá thể Date luôn luôn sau() Dấu thời gian. Điều này là khó hiểu, vì (a) hợp đồng cho trước() xác định một so sánh nghiêm ngặt và (b) nếu không bằng nhau, Dấu thời gian, bởi vì nó có nano giây, có thể là sau() ngày. Nhưng các kết quả ngược lại và lặp lại (với JDK 1.6 và 1.7, với các múi giờ JVM khác nhau). So sánh hai Ngày hoạt động chính xác, nhưng gọi trước() hoặc after() trên một ngày và đưa ra một đối số Dấu thời gian có kết quả không mong muốn.java.sql.Timestamp được tạo từ java.util.Date, tại sao luôn luôn trước() nó?
Mã mẫu bên dưới có hai trường hợp Ngày và một Dấu thời gian, tất cả chúng có cùng giá trị mili giây. Tuy nhiên, so sánh một ngày với dấu thời gian hiển thị ngày để sau() Dấu thời gian.
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?
}
}
Mẫu đầu ra:
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
Dòng cuối cùng là một tò mò.
Cảm ơn bạn.
Sử dụng trình gỡ lỗi để chỉ ra điều đó. Và nhắc nhở [Timestamp API] (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...] khuyên rằng mã không xem giá trị Dấu thời gian một cách tổng quát như một thể hiện của java.util.Date. "* – Kai
' d1.compareTo (ts); 'kết quả' 1', cho biết có sự khác biệt 1 nano hoặc một cái gì đó tương tự. ___ Tôi tin rằng đó là một lỗi, vâng. Tốt lắm, tìm việc đó! – XenoRo