TL;博士
是否有可能获得微秒的Java 8?
否使用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的OpenJDK实现。其他可能有所不同
的Java 9后来
的Java 9具有能够捕捉分辨率细当前时刻比毫秒(小数位数)的java.time.Clock
的fresh implementation一个。
实际分辨率取决于您的主机硬件时钟的限制。在使用Oracle Java 9.0.4的macOS Sierra上,我获得了微秒(六个小数位数)的当前时刻。
Instant.now().toString()
2018-03-09T21:03:33.831515Z
爪哇8
的java.time Java中的类8是新的这些类被定义为携带纳秒( 九个小数点的位数)。但捕捉当前时刻仅限于毫秒。
2018-03-09T21:03:33.831Z
其他问题
System.currentTimeMillis()
如果我得到System.currentTimeMillis的()和System.nanoTime()
无需使用System.currentTimeMillis()
再次。取而代之的是,在UTC中使用java.time.Instant
片刻,分辨率可以达到纳秒。
如果您确实需要1970-01-01T00:00Z的时期参考值的毫秒数,请询问Instant
对象。请注意数据丢失,因为您会忽略Instant
中存在的任何微秒或纳秒。
long millisSinceEpoch = instant.now().toEpochMilli() ;
有,我可以从这些数值解析时钟时间的方法吗?
是的,您可以将自1970-01-01T00:00Z以来的毫秒数转换为Instant
。
Instant instant = Instant.ofEpochMilli(millisSinceEpoch) ;
System.nanoTime()
至于System.nanoTime()
,旨在用于跟踪经过的时间,如基准代码的性能。打电话System.nanoTime()
确实不是告诉你任何有关当前日期时间。
该值是自某些无证文原点时间点以来的纳秒数。在实践中,我看到这个数字似乎跟踪自JVM启动以来的时间,但这种行为没有记录,因此您不应该依赖它。
LocalDateTime
是不片刻
我的问题是,我需要同时使用Java和JavaScript做记录,他们需要跨两者一致微秒场。
首先,用于记录你应该不使用LocalDateTime
类。该课堂故意缺乏任何时区或与UTC的偏移概念。因此,一个LocalDateTime
确实不是代表片刻,是而不是时间线上的一个点。 A LocalDateTime
是关于潜在的时刻的想法,其沿着大约26-27小时的范围。仅当区域/偏移量未知(不是一种好的情况)时才使用LocalDateTime
,或者如果这表示诸如“圣诞节从2018年12月25日的第一刻开始”,其中圣诞节开始于全球不同地区的不同时刻,首先从远东(太平洋)开始,然后在午夜后的午夜向西移动。
对于日志记录,您应该使用UTC。在Java中,这将是Instant
类,按照定义始终以UTC表示。请致电Instant.now()
。
当序列化为文本(例如日志记录)时,请始终使用标准的ISO 8601格式。 java.times类在解析/生成字符串时默认使用这些标准格式。你在本答案中看到了上面的例子。
ISO 8601
在ISO 8601,第二的小数部分可以具有任何数量的数字。所以你真的不应该在乎记录的事件是以毫秒,微秒或纳秒记录的。
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") ;
截断
如果你真的相信你需要统一的分辨率,可以truncate a Instant
。
Instant instant = Instant.now().truncatedTo(ChronoUnit.MILLIS) ; // Strip away any microseconds or nanoseconds.
不要担心分辨率
我的问题是,我需要同时使用Java和JavaScript做记录,他们需要跨两者一致微秒场。
首先,我怀疑你真的需要关心这一点。如果您在Java中使用标准ISO 8601格式和Instant
类,则可以以毫秒,微米或纳米级方式成功序列化和重新水合一段时间。
即使分数秒分辨率变化,ISO 8601格式化字符串也会按照时间顺序排列。其次,如果您试图以某种原因追踪实际时刻为微秒,您很可能会感到失望。截至2018年,传统的计算机时钟在微秒范围内不可靠。
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类代替了日期时间类legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目,现在在maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
您可以直接使用数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC driver。无需字符串,不需要java.sql.*
类。
从何处获取java.time类?
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
http://stackoverflow.com/questions/33472569/any-new-method-to-get-current-time-with-accuracy-in-microseconds-in-java-now – Jens
该帖子原本是从2009年和更新的答案是我遇到问题的解决方案。我正在寻找不同的东西。 – annedroiid
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#now--是最精确时间戳的最佳可用方法。 –