tl; dr
Java 9 trở lên: Độ phân giải lên tới nano giây khi chụp khoảnh khắc hiện tại. Đó là 9 chữ số của phân số thập phân.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Để giới hạn đến micro giây , hãy cắt bớt .
Instant // Represent a moment in UTC.
.now() // Capture the current moment. Returns a `Instant` object.
.truncatedTo( // Lop off the finer part of this moment.
ChronoUnit.MICROS // Granularity to which we are truncating.
) // Returns another `Instant` object rather than changing the original, per the immutable objects pattern.
2017-12-23T12: 34: 56.123456Z
Trong thực tế, bạn sẽ chỉ thấy micro giây được ghi lại .now
vì đồng hồ phần cứng máy tính thông thường hiện đại không chính xác tính bằng nano giây .
Chi tiết
Các câu trả lời khác có phần lỗi thời so với Java 8.
java.time
Java 8 trở lên đi kèm với khuôn khổ java.time . Các lớp mới này sẽ thay thế các lớp ngày-thời gian có sai sót gây rắc rối được vận chuyển bằng các phiên bản Java sớm nhất như java.util.Date/.Calendar và java.text.SimpleDateFormat. Khung được định nghĩa bởi JSR 310, lấy cảm hứng từ Joda-Time , được mở rộng bởi dự án ThreeTen-Extra.
Các lớp trong java.time phân giải thành nano giây , mịn hơn nhiều so với mili giây được sử dụng bởi cả các lớp date-time cũ và bởi Joda-Time. Và mịn hơn so với micro giây được hỏi trong Câu hỏi.
Clock
Thực hiện
Trong khi các lớp java.time hỗ trợ dữ liệu đại diện cho các giá trị tính bằng nano giây, thì các lớp này chưa tạo ra các giá trị tính bằng nano giây. Các now()
phương pháp sử dụng cùng một triển khai đồng hồ cũ như các lớp ngày-giờ cũ , System.currentTimeMillis()
. Chúng tôi có Clock
giao diện mới trong java.time nhưng việc triển khai cho giao diện đó là đồng hồ mili giây cũ.
Vì vậy, bạn có thể định dạng biểu diễn văn bản của kết quả ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
để xem chín chữ số của một phân số thứ hai nhưng chỉ ba chữ số đầu tiên sẽ có các số như sau:
2017-12-23T12:34:56.789000000Z
Đồng hồ mới trong Java 9
Các triển khai OpenJDK và Oracle của Java 9 có Clock
triển khai mặc định mới với độ chi tiết tốt hơn, lên đến khả năng nano giây đầy đủ của các lớp java.time.
Xem sự cố OpenJDK, Tăng độ chính xác của việc triển khai java.time.Clock.systemUTC () . Vấn đề đó đã được thực hiện thành công.
2017-12-23T12:34:56.123456789Z
Trên MacBook Pro (Retina, 15 inch, cuối năm 2013) với macOS Sierra, tôi nhận được thời điểm hiện tại tính bằng micro giây (tối đa sáu chữ số của phần thập phân).
2017-12-23T12:34:56.123456Z
Đồng hồ phần cứng
Hãy nhớ rằng ngay cả với một Clock
triển khai mới tốt hơn , kết quả của bạn có thể khác nhau tùy theo máy tính. Java phụ thuộc vào đồng hồ của phần cứng máy tính bên dưới để biết thời điểm hiện tại.
- Các nghị quyết của các đồng hồ phần cứng khác nhau. Ví dụ: nếu đồng hồ phần cứng của một máy tính cụ thể chỉ hỗ trợ độ chi tiết micro giây , thì mọi giá trị ngày-giờ được tạo sẽ chỉ có sáu chữ số của giây phân số với ba chữ số cuối cùng là số không.
- Độ chính xác của đồng hồ phần cứng rất khác nhau. Chỉ vì đồng hồ tạo ra một giá trị với một số chữ số của phần thập phân của giây, những chữ số đó có thể không chính xác, chỉ là những con số gần đúng, lệch so với thời gian thực như có thể được đọc từ đồng hồ nguyên tử . Nói cách khác, chỉ vì bạn nhìn thấy một loạt các chữ số ở bên phải dấu thập phân không có nghĩa là bạn có thể tin tưởng thời gian đã trôi qua giữa các lần đọc như vậy là đúng với độ phút đó.