如何获得当前时间戳达到纳秒的精度?

时间:2014-06-18 09:21:04

标签: java android timestamp unix-timestamp

我使用System.currentTimeInMillis()方法获取MilliSeconds中的当前时间戳。我还使用System.nanoTime(),但它仅用于测量经过的时间。

如何以纳秒精度获取当前时间戳?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

@ T-Rush,您对我的评论的回答恕我直言,应该添加到您的问题中。顺便说一句,这是所谓的AB问题的典型例子。

解决方案不是将当前时间戳用作主键。实际上恕我直言,最好的方法是使用自动生成的ID。在这种情况下,这是DB的责任。

但是,出于某种原因,您必须在应用程序级别管理ID,您也有几种可能性。

  1. 使用java.util.UUID。这保证了唯一性,但不允许您按ID排序您的条目,这有时很有用。

  2. 应用程序启动时从System.currentTimeMillis()检索到的UTC时间戳的用户组合以及从System.nanoTime()

  3. 检索的应用程序时间

    显然还有其他解决方案,我相信如果您提供有关您的应用程序和数据的更多详细信息,社区可以建议您更好地设计。

答案 1 :(得分:1)

TL;博士

Instant.now() 

java.time

现代方法使用Java 8及更高版本以及最新Android中内置的java.time类。对于早期的Android,请参阅下面的最后一个项目符号。

避免使用最早版本的Java中的旧版日期时间类。它们很麻烦,容易混淆,设计很差,而且有缺陷。

Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

要以UTC格式捕获当前时刻,请致电Instant.now

Instant instant = Instant.now() ;  // Current moment in UTC.

自2018年起,传统的计算机硬件时钟无法以纳秒级的分辨率捕获当前时刻。通常,您只能以微秒或更粗的粒度获得当前时刻。

在OpenJDK& Java的Java实现,Java 8仅在几毫秒内捕获当前时刻。这些实现中的Java 9带来了Clock的新实现,现在能够以更精细的分辨率捕获当前时刻。在使用Java 9.0.1的Oracle JDK的MacBook Pro(Retina,15英寸,2013年末)上的macOS上,我看到当前时刻以六位小数(微秒)捕获。

  

instant.toString():2018-01-09T05:26:04.327132Z

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?