java.sql.Timestamp constructor đi như thế này:java.sql.Timestamp cách lưu trữ nano giây
public Timestamp(long time) {
super((time/1000)*1000);
nanos = (int)((time%1000) * 1000000);
if (nanos < 0) {
nanos = 1000000000 + nanos;
super.setTime(((time/1000)-1)*1000);
}
}
Nó về cơ bản chấp nhận thời gian trong một phần nghìn giây và sau đó trích xuất 3 chữ số cuối cùng và làm cho nó Nanos. Vì vậy, đối với một giá trị mili giây là 1304135631 , tôi nhận được Dấu thời gian.getnanos() là . Đây là tính toán đơn giản (thêm 6 số 0 ở cuối) ... dường như không tối ưu.
Cách tốt hơn có thể là trình tạo dấu thời gian chấp nhận thời gian tính bằng nano giây và sau đó tính giá trị nano giây.
Nếu bạn chạy chương trình dưới đây, bạn sẽ thấy sự khác biệt giữa nano giây thực tế và một giây được trả về theo cách Timestamp tính toán nanosecod.
long a = System.currentTimeMillis();
for(;;){
long b = System.currentTimeMillis();
Timestamp tm = new Timestamp(System.currentTimeMillis());
System.out.println(tm.getTime());
System.out.println(tm.getNanos());
System.out.println("This is actual nanos" + System.nanoTime()%1000000000);
System.out.println("--------------------------");
if(b-a >= 1)
break;
}
Vì vậy, tất cả các cuộc thảo luận về Dấu thời gian cho biết lưu trữ thời gian lên đến nano giây, có vẻ không chính xác .. Phải không?
Có .. Điều này chắc chắn sẽ hoạt động. Vì vậy, để làm cho Dấu thời gian thực sự lưu trữ các nanô, nó phải là quá trình hai bước. Bit lúng túng, thay vào đó một Constructor chấp nhận nanos (từ ngày 1 tháng 1 năm 1970) sẽ là một giải pháp tốt hơn. – Vicky
Không có điều này không an toàn! Nó kết thúc tốt đẹp! Vấn đề là 'currentTimeMillis' và' nanoTime' có thể không đồng ý với độ phân giải lớn hơn. ví dụ. 'nanoTime' trả về giá trị 12: 06: 30.9999, 12:06: ** 31 ** .1111 nhưng' currentTimeMillis' trả về 12: 06: 30.666 12:06: ** 30 ** .777, sau đó sử dụng mã ở trên để khởi tạo dấu thời gian sẽ dẫn đến dấu thời gian 12: 06: 30,9999, 12:06: ** 30 ** .1111. Một cách riêng biệt, nhận xét của @Vicky, bạn sẽ khởi tạo một dấu thời gian trước năm 1970 như thế nào? – Luciano
Đúng là thiết lập nano giây phải được đặt riêng, nhưng sử dụng 'System # nanoTime()' như thế này là không chính xác. Tài liệu API cho 'System # nanoTime()' nói: "Phương pháp này chỉ có thể được sử dụng để đo thời gian trôi qua và không liên quan đến bất kỳ khái niệm nào khác về hệ thống hoặc đồng hồ treo tường.Giá trị được trả về đại diện cho nano giây kể từ thời điểm cố định nhưng tùy ý (có lẽ trong tương lai, vì vậy các giá trị có thể âm). (Xem http://download.oracle.com/javase/6/docs/api/java/lang/System .html # nanoTime% 28% 29) –