为什么将System.nanoTime()转换为Calendar对象会给我错误的当前日期?

Mat*_*ros 3 java android

如果我理解正确,使用System.nanoTime()是一种更准确的方法来保持标记当前时间System.currentTimeInMillis(),即使系统时间已更改.那么为什么当我将long值转换nanoTime()Calendar对象时,输出是错误的?

import java.util.Calendar;

public class Test {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
        System.out.println(c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE) + " " + c.get(Calendar.YEAR) +
                " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND)
                + ":" + c.get(Calendar.MILLISECOND));
    }

}
Run Code Online (Sandbox Code Playgroud)

Ami*_*nde 8

System.nanotime() javadoc建议:

返回最精确的可用系统计时器的当前值,以纳秒为单位.

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负).该方法提供纳秒精度,但不一定是纳秒精度.不保证值的变化频率.由于数值溢出,跨越大于约292年(263纳秒)的连续调用的差异将无法准确计算经过的时间.

例如,要测量某些代码执行所需的时间:

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
Run Code Online (Sandbox Code Playgroud)