0

我正在创建一个Java 应用程序,其中操作系统的系统时钟会不时调整。(所以它就像一个点对点的 NTP 实验)

我正在寻找一个类似于虚拟时钟的 Java 构造,在其中我仍然可以从应用程序执行的时间开始以毫秒为单位获取应用程序的年龄。因为如果我总是只使用System.currentTimeMillis(),它可能会给我应用程序的错误年龄。

有没有类似的东西?没有真正为它创建另一个线程?

4

2 回答 2

1

没有办法直接在 Java 中执行此操作,唯一的解决方案是记录应用于系统时钟的时差,并在您的应用程序中考虑到这一点。

当然,这在很大程度上取决于底层操作系统和用于调整系统时钟的工具。

于 2013-08-29T07:29:20.470 回答
1

要计算程序的运行时间,您有多种可能性。并非所有程序都适合您的程序,因为您的系统时间可能会在程序运行时更改。

当前时间米利斯()

使用这种方法,您可以获得系统的当前时间(以毫秒为单位)。如果要计算程序的运行时间,可以将 currentTime 保存在 long 变量中。当您想要程序需要的时间时,您只需用您保存的时间减去当前时间即可。

节省程序启动的时间!

long start = System.currentTimeMillis();

减去结束时间和开始时间!

long need = System.currentTimeMillis() - start;

请记住,如果您更改系统时间,您会得到错误的时间

纳米时间()

使用 nanoTime,您可以获得以纳秒为单位的虚拟 Java 机器的运行时间。如果你想计算经过的时间,你必须和 currentTimeMillis() 一样。一开始你节省时间,最后你减去它。

节省程序启动的时间!

long start = System.nanoTime();

减去结束时间和开始时间!

long need = (System.nanoTime() - start) / 1000000; // divide to get millisecounds

请记住,即使您更改系统时间,您也得到了正确的时间,因为您使用的是虚拟 Java 机的时间!

区别

您只能获得正确的经过时间System.nanoTime()。你不应该使用System.currentTimeMillis(),除非你不介意你的结果是错误的。currentTimeMillis()是测量“挂钟”时间。当您的系统时间更新时,您只会得到错误的时间。nanoTime()真的很生气,因为你计算了经过的时间。

于 2013-08-29T08:12:02.877 回答