LocalDateTime.now() has different levels of precision on Windows and Mac machine
If anyone had the same issue with Instant
precision on mac
or ubuntu
on Java 15 that I want to show the difference:
mac Instant precision: 2021-03-10T12:28:19.228816Z
ubuntu Instant precision: 2021-03-10T12:28:19.228816800Z
Solution: please add .truncatedTo(ChronoUnit.MILLIS)
to Instant
variable if You want to have the same precision on this OS
The precision is different because LocalDateTime.now()
uses a system default Clock
.
Obtains the current date-time from the system clock in the default time-zone.
This will query the system clock in the default time-zone to obtain the current date-time.
...
The link in this Javadoc takes you to Clock.systemDefaultZone()
which states (emphasis mine):
Obtains a clock that returns the current instant using the best available system clock, converting to date and time using the default time-zone.
This clock is based on the best available system clock. This may use System.currentTimeMillis(), or a higher resolution clock if one is available.
...
Which clock Java uses can depend on a lot of things and it looks like your Mac computer has a clock with microsecond precision whereas your Windows computer has a clock with millisecond precision. I'm not aware of any way to increase the precision of a clock but you can definitely decrease the precision so that it matches across platforms.
One option is to do as Ole V.V. does in his answer and use LocalDateTime.truncatedTo(TemporalUnit)
.
Another option is to plug in your own Clock
and use LocalDateTime.now(Clock)
. If possible, I would use Clock.tickMillis(ZoneId)
since this method returns a Clock
that truncates to milliseconds.
Obtains a clock that returns the current instant ticking in whole milliseconds using the best available system clock.
This clock will always have the nano-of-second field truncated to milliseconds. This ensures that the visible time ticks in whole milliseconds. The underlying clock is the best available system clock, equivalent to using system(ZoneId).
...
Since:
9
I don’t think you can get any better precision than the one you are already getting. If you want to reduce the precision to match that of the other system, it’s straightforward (when you know how):
LocalDateTime.now(ZoneId.of("Europe/Berlin")).truncatedTo(ChronoUnit.MILLIS);
The precision you get depends on the hardware, the settings, the OS and the integration of the JVM with all of those. It’s well known that Mac generally offers better precision than Windows (though I was under the impression that this was only the case from Java 9, per OpenJDK issue # JDK‑8068730).