LocalDateTime.now() 在 Windows 和 Mac 机器上具有不同级别的精度
在我的Mac和Windows机器上创建新的使用时,我在Mac上的纳米精度为6,在Windows机器上的纳米精度为3。两者都在运行。LocalDateTime
LocalDateTime.now()
jdk-1.8.0-172
- 是否可以限制或提高其中一台机器的精度?
- 为什么精度实际上不同?
在我的Mac和Windows机器上创建新的使用时,我在Mac上的纳米精度为6,在Windows机器上的纳米精度为3。两者都在运行。LocalDateTime
LocalDateTime.now()
jdk-1.8.0-172
精度是不同的,因为 LocalDateTime.now()
使用系统默认时钟
。
从默认时区的系统时钟获取当前日期时间。
这将查询默认时区的系统时钟以获取当前日期时间。
...
此Javadoc中的链接将带您进入哪些状态(强调我的):Clock.systemDefaultZone()
获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。
此时钟基于最佳可用系统时钟。这可能使用 System.currentTimeMillis() 或更高分辨率的时钟(如果有)。
...
Java使用哪种时钟可能取决于很多事情,看起来您的Mac计算机具有微秒精度的时钟,而Windows计算机具有具有毫秒精度的时钟。我不知道有什么方法可以提高时钟的精度,但你绝对可以降低精度,以便它跨平台匹配。
一种选择是像Ole V.V.在他的答案中所做的那样,并使用LocalDateTime.truncatedTo(TemporalUnit)。
。
另一种选择是插入您自己的并使用LocalDateTime.now(Clock)。
。如果可能的话,我会使用Clock.tickMillis(ZoneId
),因为此方法返回一个截断到毫秒。Clock
Clock
获取一个时钟,该时钟使用最佳可用系统时钟以整毫秒为单位返回当前即时滴答声。
此时钟将始终将秒的纳秒场截断为毫秒。这可确保可见时间以整毫秒为单位滴答作响。底层时钟是可用的最佳系统时钟,相当于使用 system(ZoneId)。
...
自:
9
我不认为你能得到比你已经得到的精度更好的精度。如果您想降低精度以匹配其他系统的精度,这很简单(当您知道如何操作时):
LocalDateTime.now(ZoneId.of("Europe/Berlin")).truncatedTo(ChronoUnit.MILLIS);
您获得的精度取决于硬件,设置,操作系统以及JVM与所有这些的集成。众所周知,Mac通常提供比Windows更好的精度(尽管我的印象是,根据OpenJDK问题#JDK-8068730,Java 9的情况就是如此)。