Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System.currentTimeMillis()的时间错误(Java)_Java_Time - Fatal编程技术网

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

System.currentTimeMillis()的时间错误(Java),java,time,Java,Time,我制作了一个小程序来测试系统。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 =

我制作了一个小程序来测试系统。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
如您所见,第3行有一个问题。米利斯的时间不对。它应该介于1261860501012和1261860501033之间。 误差大约为73毫秒

有人知道问题出在哪里

非常感谢

比卢尤特

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

我的代码:

while (true) 
    setLog (System.currentTimeMillis ());

编辑:该程序在基于Linux的VPS上运行首先,您有一点输入错误,它是73毫秒,而不是几秒钟(这会让人不安:-)

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

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

编辑:

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

long foo = System.currentTimeMillis();
setLog(foo); 

我们曾经看到过类似的事情,在Ubuntu上运行AMD64x2芯片。如果你也有芯片,那就是我开始寻找的地方

系统。currentTimeMillis()
取决于系统时钟。看起来系统时钟已经被一个外部程序微校正了,对于Linux来说,这可能是错误的


注意:您不应该使用
System.currentTimeMillis()
来测量经过的时间。最好使用
System.nanoTime()
,但即使这样也不能保证是单调的。

所讨论的方法取决于系统时钟,系统时钟可能会有问题。有关通过ntpd(8)守护进程保持系统时钟准确的问题的讨论,请参阅


我还建议大家讨论一下VMWare中系统时钟的准确性。它还对一般的系统时钟进行了极好的讨论。

什么操作系统?什么版本的Java?OS:Debian 4.0,Java:6_17。代码:while(true){setLog(System.currentTimeMillis())};(不确定这是否与您的情况相关,但)也请查看Kevin Bourrillion关于
currentTimeMillis
nanoTime
的区别的这篇文章:@bill0ute:请不要在评论中添加澄清。编辑你的问题并添加新的信息。这被错误地编辑了-时间差是4398秒。嗯,我很确定这是73秒,因为第3行和第4行之间的差异大约是4300000毫秒。但是日志时间戳表明了一些不同的东西,无论如何,似乎在某个地方有不想要的副作用。你试过我上面的方法吗?我不明白什么是“有问题的方法”。4300000毫秒是4300秒。你也可以用NTP得到73秒的移位;),我的程序在VPS上,我找不到它的芯片。VPS可能会引导我们找到答案。Xen和VMWare都在为客户机模拟(或操纵)CPU计时器,因此给出的值几乎不可靠。某些版本的CPU时间(滴答声)甚至会向后移动,这是众所周知的错误。不过,如果日志系统一直运行良好,那么您仍然想知道它在做什么。虽然它可能已经做了一个min()的变通。NTP不会调整时间向前,然后再向后。而且,格式化的时间保持不变。同意您的观点,避免使用时钟来计算时间流逝,但我会使用一种秒表实现(例如来自Apache)。