LocalDateTime.now() 在 Windows 和 Mac 机器上具有不同级别的精度

2022-09-01 18:44:51

在我的Mac和Windows机器上创建新的使用时,我在Mac上的纳米精度为6,在Windows机器上的纳米精度为3。两者都在运行。LocalDateTimeLocalDateTime.now()jdk-1.8.0-172

  • 是否可以限制或提高其中一台机器的精度?
  • 为什么精度实际上不同?

答案 1

精度是不同的,因为 LocalDateTime.now() 使用系统默认时钟

从默认时区的系统时钟获取当前日期时间。

这将查询默认时区的系统时钟以获取当前日期时间。

...

此Javadoc中的链接将带您进入哪些状态(强调我的):Clock.systemDefaultZone()

获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。

此时钟基于最佳可用系统时钟。这可能使用 System.currentTimeMillis() 或更高分辨率的时钟(如果有)。

...

Java使用哪种时钟可能取决于很多事情,看起来您的Mac计算机具有秒精度的时钟,而Windows计算机具有具有毫秒精度时钟。我不知道有什么方法可以提高时钟的精度,但你绝对可以降低精度,以便它跨平台匹配。

一种选择是像Ole V.V.在他的答案中所做的那样,并使用LocalDateTime.truncatedTo(TemporalUnit)。

另一种选择是插入您自己的并使用LocalDateTime.now(Clock)。。如果可能的话,我会使用Clock.tickMillis(ZoneId),因为此方法返回一个截断到毫秒。ClockClock

获取一个时钟,该时钟使用最佳可用系统时钟以整毫秒为单位返回当前即时滴答声。

此时钟将始终将秒的纳秒场截断为毫秒。这可确保可见时间以整毫秒为单位滴答作响。底层时钟是可用的最佳系统时钟,相当于使用 system(ZoneId)。

...

自:
9


答案 2

我不认为你能得到比你已经得到的精度更好的精度。如果您想降低精度以匹配其他系统的精度,这很简单(当您知道如何操作时):

LocalDateTime.now(ZoneId.of("Europe/Berlin")).truncatedTo(ChronoUnit.MILLIS);

您获得的精度取决于硬件,设置,操作系统以及JVM与所有这些的集成。众所周知,Mac通常提供比Windows更好的精度(尽管我的印象是,根据OpenJDK问题#JDK-8068730,Java 9的情况就是如此)。


推荐