我使用System.currentTimeInMillis()
方法获取MilliSeconds中的当前时间戳。我还使用System.nanoTime()
,但它仅用于测量经过的时间。
如何以纳秒精度获取当前时间戳?
任何帮助表示感谢。
答案 0 :(得分:1)
@ T-Rush,您对我的评论的回答恕我直言,应该添加到您的问题中。顺便说一句,这是所谓的AB问题的典型例子。
解决方案不是将当前时间戳用作主键。实际上恕我直言,最好的方法是使用自动生成的ID。在这种情况下,这是DB的责任。
但是,出于某种原因,您必须在应用程序级别管理ID,您也有几种可能性。
使用java.util.UUID。这保证了唯一性,但不允许您按ID排序您的条目,这有时很有用。
应用程序启动时从System.currentTimeMillis()
检索到的UTC时间戳的用户组合以及从System.nanoTime()
显然还有其他解决方案,我相信如果您提供有关您的应用程序和数据的更多详细信息,社区可以建议您更好地设计。
答案 1 :(得分:1)
Instant.now()
现代方法使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?