System.currentTimeMillis()的时间错误(Java)
我制作了一个小程序来测试系统。currentTimeMillis()。我有一个奇怪的结果。这是我的日志: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 =
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)。