System.currentTimeMillis()(Java)错误的时间

bil*_*ute 11 java time

我做了一个小程序来测试System.currentTimeMillis().我有一个奇怪的结果.这是我的日志:

1    26-12-09 20:48:21 - [Log] lTime = 1261860501009
2    26-12-09 20:48:21 - [Log] lTime = 1261860501012
3    26-12-09 20:48:21 - [Log] lTime = 1261864899078
4    26-12-09 20:48:21 - [Log] lTime = 1261860501033
5    26-12-09 20:48:21 - [Log] lTime = 1261860501069
Run Code Online (Sandbox Code Playgroud)

如您所见,第3行存在问题.时间磨损是错误的.它应该在1261860501012和1261860501033之间.大约有73毫秒的误差.

有人知道问题来自哪里?

非常感谢

bill0ute

编辑:操作系统:Debian 4.0,Java:6_17.

我的代码:

while (true) 
    setLog (System.currentTimeMillis ());
Run Code Online (Sandbox Code Playgroud)

编辑:程序在基于Linux的VPS上运行

Poo*_*ool 7

System.currentTimeMillis()取决于系统时钟.看起来系统时钟已被外部程序微调,对于可能是NTP的 Linux .

请注意,您不应该System.currentTimeMillis()用来衡量经过的时间.它最好使用,System.nanoTime()但即使这不保证是单调的.


mor*_*itz 0

首先,你有一个小错字,它是 73 毫秒,而不是秒(那么会令人不安:-))。

言归正传,您应该知道 Java 是一种非常高级的语言,只能通过本机函数调用来访问系统函数。这些调用是由您的虚拟机实现的,并且有很多(Sun、Open、Dalvik..),因此无法给出一般建议,但返回时间 currentTimeMillis 取决于很多东西,例如线程(在VM以及本机线程中),板载计时器的分辨率等。我承认结果很奇怪,但除非你高度依赖它们的正确顺序,否则我不会打扰,只是忍受异常范围为十分之一秒。

如果您需要更具体的建议,请粘贴一些您的源代码!

编辑:

在看过你的源代码后,我很确定你的 Log 函数使用了某种优先级处理或线程,这会导致错误的结果。只需尝试分配相关方法的返回值并将该变量传递到您的日志:

long foo = System.currentTimeMillis();
setLog(foo); 
Run Code Online (Sandbox Code Playgroud)

  • 4,300,000 毫秒是 4,300 秒。 (2认同)