Java 8 LocalDateTime.now()只提供毫秒的精度
在Java8中可以获得微秒吗?Java8Java 8 LocalDateTime.now()只提供毫秒的精度,java,clock,Java,Clock,在Java8中可以获得微秒吗?Java8LocalDateTime类有一个.getNano()方法,该方法用于返回纳秒,但在Linux(Ubuntu)和OSX(10.11.5)上,它只返回毫秒(当我运行它时,它返回301000,这等于301毫秒)我真的需要能够获得微秒 我知道在我的计算机上可以获得纳秒(因此可以从中获得微秒),因为javascript方法process.hrtime()返回精确的值 在任何人开始一个精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较 编辑:
LocalDateTime
类有一个.getNano()
方法,该方法用于返回纳秒
,但在Linux(Ubuntu)和OSX(10.11.5)上,它只返回毫秒
(当我运行它时,它返回301000
,这等于301毫秒
)我真的需要能够获得微秒
我知道在我的计算机上可以获得纳秒
(因此可以从中获得微秒
),因为javascript方法process.hrtime()
返回精确的值
在任何人开始一个精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较
编辑:
需要说明的是,LocalDateTime
类是Java8Java.time
类集合的一部分
更新:
所以我意识到Javascript的process.hrtime
与Java的System.nanoTime()
类似,实际上与挂钟无关,而是时间,因为两种语言之间存在一些不同的任意值
新问题:有没有一种方法可以从这些值解析时钟时间?例如,如果我得到System.currentTimeMillis()
和System.nanoTime()
,并将其与另一组值进行比较,我可以得到第二组值的实际时间吗
我的问题是,我需要同时使用Java和Javascript进行日志记录,它们需要在这两种语言中都有一个一致的微秒字段。而您的计算机能够报告更精确的内容(但可能不准确,至少在墙时间内不准确)毫秒以上,这不会改变以下事实:Java默认值使用的是基于
System.currentTimeMillis()
您必须获得比ms更精确的值。也就是说,LocalDate.now()
依赖于SystemClock::instant()
方法,该方法使用System.currentTimeMillis()
,因此您无法使用默认时钟获得更精确的分辨率
但是,您可以实现自己的高精度时钟
,并将其与LocalDate结合使用:
LocalDate hpDate = LocalDate.now(microsecondClock);
对于高精度,您可以使用带有微秒刻度的滴答声时钟
:
Clock microsecondClock = Clock.tick(Clock.systemUTC(), Duration.ofNanos(1000));
或子类Clock
并实现您自己的高精度时钟,即使用System.currentTimemillis()和System.nanoTime()。tl;博士
在Java8中可以获得微秒吗
否。请使用Java 9或更高版本
Instant.now() // Returns a value in microseconds in Java 9 and later, but is restricted to mere milliseconds in Java 8.
这是指Java 8/9的Oracle和OpenJDK实现。其他可能会有所不同
Java9及更高版本
Java9具有一种能够以小于毫秒(小数点的三位数)的分辨率捕获当前时刻的能力
实际分辨率取决于主机硬件时钟的限制。在使用Oracle Java 9.0.4的macOS Sierra上,我用微秒(小数点的六位数字)获得当前时刻
2018-03-09T21:03:33.831515Z
爪哇8
java.time类是Java8中的新类。这些类被定义为携带纳秒(十进制小数的九位数)。但是捕获当前时刻仅限于Java8,而Java9对其进行了增强,以更精细的方式捕获当前时刻
2018-03-09T21:03:33.831Z
其他问题
System.currentTimeMillis()
如果我得到System.currentTimeMillis()和System.nanoTime()
无需再次使用System.currentTimeMillis()
。相反,在UTC中使用java.time.Instant
片刻,分辨率为纳秒
Instant instant = Instant.parse( "2018-03-09T21:03:33.123456789Z" ) ;
Instant instant = Instant.parse( "2018-03-09T21:03:33.123456Z" ) ;
Instant instant = Instant.parse( "2018-03-09T21:03:33.123Z" ) ;
如果您确实需要从1970-01-01T00:00Z的历元引用开始计算毫秒数,请询问Instant
对象。请注意数据丢失,因为您将忽略即时
中存在的任何微秒或纳秒
long millisSinceEpoch = instant.now().toEpochMilli() ;
Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;
有没有一种方法可以从这些值解析时钟时间
是的,您可以将1970-01-01T00:00Z纪元以来的毫秒数转换为瞬间
long millisSinceEpoch = instant.now().toEpochMilli() ;
Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;
System.nanoTime()
至于System.nanoTime()
,它用于跟踪运行时间,例如对代码的性能进行基准测试。调用System.nanoTime()
不会告诉您有关当前日期和时间的任何信息
此值是自某个未记录的原点起的纳秒计数。在实践中,我看到这个数字似乎跟踪JVM启动后的时间,但是这个行为没有文档记录,因此您不应该依赖它
LocalDateTime
不是一个时刻
我的问题是,我需要同时使用Java和Javascript进行日志记录,并且它们需要在这两种语言之间有一个一致的微秒字段
首先,对于日志记录,您不应该使用LocalDateTime
class。该类故意缺乏时区或UTC偏移的概念。因此,LocalDateTime
并不代表一个时刻,也不是时间线上的一个点。LocalDateTime
是关于26-27小时范围内潜在时刻的概念。仅当区域/偏移未知(不是一个好情况)或表示“圣诞节从2018年12月25日第一刻开始”,即全球不同地区的圣诞节从不同时刻开始,首先从远东(太平洋)开始时,才使用LocalDateTime
,在连续午夜之后向西移动
对于日志记录,您应该使用UTC。在Java中,这将是一个类,根据定义始终是UTC。只需调用Instant.now()
当序列化为文本(如用于日志记录)时,始终使用标准格式。默认情况下,java.time类在解析/生成字符串时使用这些标准格式。你看到了我上面的例子