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

Tob*_*all 11 java precision platform java-time

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

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

Sla*_*law 14

精度不同,因为LocalDateTime.now()使用系统默认值Clock.

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

这将在默认时区中查询系统时钟以获取当前日期时间.

...

这个Javadoc中的链接将您带到Clock.systemDefaultZone()哪些状态(强调我的):

获取使用最佳可用系统时钟返回当前时刻的时钟,使用默认时区转换为日期和时间.

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

...

Java使用的时钟取决于很多东西,看起来你的Mac电脑有一个微秒精度的时钟,而你的Windows电脑有一个毫秒精度的时钟.我不知道有什么方法可以提高时钟的精度,但你绝对可以降低精度,以便它可以跨平台进行匹配.

一个选择是Ole VV在他的回答和使用中做的LocalDateTime.truncatedTo(TemporalUnit).

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

获得一个时钟,使用最佳可用系统时钟以整数毫秒返回当前瞬时滴答.

此时钟将始终具有截断到毫秒的纳秒级字段.这确保了可见时间以整数毫秒为单位.基础时钟是最佳可用系统时钟,相当于使用系统(ZoneId).

...

从:
9

  • 换句话说,当前时刻的分辨率是实现细节. (3认同)

Mat*_*W90 10

如果有人在 Java 15 上或在 Java 15 上遇到同样的Instant精度问题,我想展示其中的差异:macubuntu

mac 即时精度:2021-03-10T12:28:19.228816Z

ubuntu 即时精度:2021-03-10T12:28:19.228816800Z

解决方案:如果您想在该操作系统上具有相同的精度,请添加.truncatedTo(ChronoUnit.MILLIS)到变量Instant


Ole*_*.V. 8

我认为你不能获得比你已经获得的更精确的精确度.如果你想降低精度以匹配其他系统的精度,它很简单(当你知道如何):

LocalDateTime.now(ZoneId.of("Europe/Berlin")).truncatedTo(ChronoUnit.MILLIS);
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想控制你得到的东西,这是一个好习惯,@ CarlosHeuberger.如果你想在那一刻获得JVM的默认时区,我仍然更喜欢`ZoneId.systemDefault()`而不是它.虽然结果是一样的,但它更清楚地读出了意图.你是对的,这个讨论与提出的问题无关. (6认同)
  • 当然,有很多"好习惯"...就像这样一个常数?喜欢避免过长的线条? (3认同)
  • 需要ZoneID吗?也许有点混乱,至少它是隐藏重要部分(笔记本电脑) (2认同)