【问题标题】:Rewrite UNIX time with nanosecond precision以纳秒精度重写 UNIX 时间
【发布时间】:2017-09-20 13:34:22
【问题描述】:

自 epoc 以来我有一个 unix 时间,以毫秒为单位,例如:1505913038295

我需要把它分成两部分。所以我可以使用 Java Instant 类方法。

Instant ofEpochSecond(long epochSecond, long nanoAdjustment) 
  1. 自纪元以来的秒数(我能做到) long secondsSince1970 = 毫秒Since1970 / 1000;

  2. 我需要帮助。我需要取毫秒的余数,比如 295,(第一个问题:我如何获得余数)然后将其转换为纳秒,然后获取当前的 System.nanoTime() 并将其添加到 nano raminder。

2017 年 9 月 20 日星期三 13:21:33 + [nano + nono 中的剩余 mili] [自 epoc 以来的秒数] + [nano + nono 中自 epoc 以来的毫秒数]

然后希望我可以调用 Instant.ofEpochSecond,类似这样。

Instant convertedTimestamp = Instant.ofEpochSecond(secondsSince1970, remaindingNanoTime % 1000000000L);

我希望这是有道理的。

【问题讨论】:

  • 有什么用?你想用这个做什么?您可能还想阅读System.nanoTime() 的文档。
  • 如果我理解正确,你需要的是Instant.ofEpochMilli(1505913038295L).plusNanos(System.nanoTime())。是吗?
  • 试试这个:Instant.ofEpochSecond(millis / 1000, millis % 1000 * 1000_000L);
  • @UsagiMiyamoto 问题说 System.nanoTime() 必须添加到 nanos 值。不知道为什么 OP 想要这样做,但这就是我的理解
  • 这听起来像XY Problem,你真正想要达到什么目的?我在问,因为System.nanoTime() 不是 当前时间的纳米部分。如果您试图将当前时间精确到纳秒,那么您需要具有该精度的Clock,这是一个完全不同的问题。还是你用错了方法,当你真正需要使用ofEpochMilli()时尝试使用ofEpochSecond()

标签: java datetime java-time java.time.instant


【解决方案1】:

如果我理解正确你想要什么,试试这样的:

Instant.ofEpochMilli( millis ).plusNanos( System.nanoTi‌​‌​me() % 1000_000L);

【讨论】:

  • 小心这个。 System.nanoTime() 通常与用于 System.currentTimeMillis() 的系统时钟不同步!没有可移植的方式来访问具有纳米精度的时钟。 System.nanoTime 可用于计算持续时间,但不能安全地解释为挂钟时间!
猜你喜欢
  • 2015-02-27
  • 2016-07-14
  • 2023-03-17
  • 2020-02-02
  • 2023-02-10
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多