Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 LocalDateTime.now()只提供毫秒的精度_Java_Clock - Fatal编程技术网

Java 8 LocalDateTime.now()只提供毫秒的精度

Java 8 LocalDateTime.now()只提供毫秒的精度,java,clock,Java,Clock,在Java8中可以获得微秒吗?Java8LocalDateTime类有一个.getNano()方法,该方法用于返回纳秒,但在Linux(Ubuntu)和OSX(10.11.5)上,它只返回毫秒(当我运行它时,它返回301000,这等于301毫秒)我真的需要能够获得微秒 我知道在我的计算机上可以获得纳秒(因此可以从中获得微秒),因为javascript方法process.hrtime()返回精确的值 在任何人开始一个精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较 编辑:

在Java8中可以获得微秒吗?Java8
LocalDateTime
类有一个
.getNano()
方法,该方法用于返回
纳秒
,但在Linux(Ubuntu)和OSX(10.11.5)上,它只返回
毫秒
(当我运行它时,它返回
301000
,这等于
301毫秒
)我真的需要能够获得
微秒

我知道在我的计算机上可以获得
纳秒
(因此可以从中获得
微秒
),因为javascript方法
process.hrtime()
返回精确的值

在任何人开始一个精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较

编辑

需要说明的是,
LocalDateTime
类是Java8
Java.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类在解析/生成字符串时使用这些标准格式。你看到了我上面的例子