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

问题描述 投票:8回答:2

我想把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 
}

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

java date nanotime
2个回答
11
投票

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

引用JavaDoc:

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

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

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


-3
投票

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

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,并将引用添加回来以获得合理的时间。

© www.soinside.com 2019 - 2024. All rights reserved.