tl; dr
Java 9 i nowsze: rozdzielczość do nanosekund podczas rejestrowania bieżącego momentu. To 9 cyfr ułamka dziesiętnego.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Aby ograniczyć do mikrosekund , obetnij .
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
W praktyce zobaczysz uchwycone tylko mikrosekundy, .now
ponieważ współczesne konwencjonalne zegary sprzętu komputerowego nie są dokładne w nanosekundach .
Detale
Pozostałe odpowiedzi są nieco nieaktualne od wersji Java 8.
java.time
Java 8 i nowsze są dostarczane ze strukturą java.time . Te nowe klasy zastępują wadliwe, kłopotliwe klasy daty i czasu dostarczane z najwcześniejszymi wersjami języka Java, takie jak java.util.Date/.Calendar i java.text.SimpleDateFormat. Framework definiuje JSR 310, zainspirowany Joda-Time , rozszerzony o projekt ThreeTen-Extra.
Klasy w java.time są rozwiązywane do nanosekund , znacznie dokładniejszych niż milisekundy używane zarówno przez stare klasy daty i godziny, jak i przez Joda-Time. I dokładniejszy niż mikrosekundy zadane w pytaniu.
Clock
Realizacja
Chociaż klasy java.time obsługują dane reprezentujące wartości w nanosekundach, klasy nie generują jeszcze wartości w nanosekundach. Te now()
metody użyć tego samego starego zegara jako realizację dawnych klas data-czasowych System.currentTimeMillis()
. Mamy nowy Clock
interfejs w java.time, ale implementacja tego interfejsu to ten sam stary zegar milisekundowy.
Więc możesz sformatować tekstową reprezentację wyniku, ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
aby zobaczyć dziewięć cyfr ułamka sekundy, ale tylko pierwsze trzy cyfry będą miały liczby takie jak ta:
2017-12-23T12:34:56.789000000Z
Nowy zegar w Javie 9
Implementacje OpenJDK i Oracle Java 9 mają nową domyślną Clock
implementację z większą szczegółowością, aż do pełnej nanosekundowej możliwości klas java.time.
Zobacz kwestię OpenJDK, Zwiększ precyzję implementacji java.time.Clock.systemUTC () . Ten problem został pomyślnie wdrożony.
2017-12-23T12:34:56.123456789Z
Na MacBooku Pro (Retina, 15-calowym, koniec 2013 r.) Z macOS Sierra otrzymuję aktualny moment w mikrosekundach (do sześciu cyfr ułamka dziesiętnego).
2017-12-23T12:34:56.123456Z
Zegar sprzętowy
Pamiętaj, że nawet przy nowej, lepszej Clock
implementacji, wyniki mogą się różnić w zależności od komputera. Java jest zależna od zegara sprzętu komputerowego, aby poznać aktualny moment.
- Rozdzielczość zegarów sprzętowe są bardzo zróżnicowane. Na przykład, jeśli zegar sprzętowy konkretnego komputera obsługuje dokładność tylko w mikrosekundach , wszelkie wygenerowane wartości daty i godziny będą miały tylko sześć cyfr ułamka sekundy, a ostatnie trzy cyfry będą zerami.
- Dokładność zegarów sprzętowe są bardzo zróżnicowane. Tylko dlatego, że zegar generuje wartość z kilkoma cyframi dziesiętnego ułamka sekundy, cyfry te mogą być niedokładne, tylko przybliżone, odbiegające od rzeczywistego czasu, które można odczytać z zegara atomowego . Innymi słowy, tylko dlatego, że widzisz kilka cyfr po prawej stronie znaku dziesiętnego, nie oznacza, że możesz ufać, że czas, który upłynął między takimi odczytami, będzie zgodny z tym minutowym stopniem.