如何将System.nanoTime的结果转换为Java中的日期?

我想将System.nanoTime()的结果转换为日期。

 public void tempBan(Player p, Player banner, int timeInSeconds){ Long timeInNano = (long) (timeInSeconds * 10^9); int newTime = (int) (System.nanoTime() + timeInNano); // here I want to convert newTime to a date } 

我已经通过乘以10 ^ 9将秒转换为纳秒 。 现在我需要将当前系统时间加上我转换为纳秒的参数转换为日期。

不幸的是, System.nanoTime()不是你想要的。

引用JavaDoc:

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。 返回的值表示纳秒,因为某些固定但任意的原始时间(可能在将来,因此值可能为负)。 在Java虚拟机的实例中,此方法的所有调用都使用相同的原点; 其他虚拟机实例可能使用不同的来源。

您可能需要System.currentTimeMillis() ,在这种情况下,您可以使用new Date(System.currentTimeMillis() + milliseconds)来获取将来该毫秒数的日期。

然后您可以减去System.nanoTime() ,缩放值,并添加System.currentTimeMillis()以获得类似的结果…因为您无论如何都要添加System.nanoTime() ,因此具有原始秒数,你可以直接使用System.currentTimeMillis()

您可以使用以下代码将其转换为系统时间

 public static long convertToUnixMs(final long timeMs) { final long refMonoMs = monoTimeMs(); final long refUnixMx = System.currentTimeMillis(); return refUnixMx + (timeMs - refMonoMs); } public static long monoTimeMs() { return System.nanoTime() / 1000000; } 

说明:

System.nonoTime()是一个单调时间,只是增加,它不知道它现在是什么时候,但它只会增加而不管。 因此,它是测量流逝时间的好方法。 但是你无法将其转换为合理的时间,因为它没有参考当前时间。

提供的方法是将存储的纳米时间转换为合理的时间的方法。 首先,你有一个你希望转换的纳米时间的timeMs。 然后,您创建了另一个纳米级(即refMonoMs)和另一个System.currentTimeMillis()(即refUnixMx)。 然后你从timeMs减去refMonoMs,并将引用添加回来以获得合理的时间。