2011-08-23 68 views
3

我正在用Java编写一个简单的计时器。它具有启动和停止按钮,以及文本视图,显示自定时器启动以来经过了多长时间。如何从系统时间获得时间增量?

它通过在System.currentTimeMillis()中设置初始时间并在循环中每秒更新当前值来实现。

问题是,如果我在计时器运行时更​​改系统时间,则整个测量将失败。例如,如果我将时间设置回一个月,则计时器显示负值,因为currentTimeMillis()现在返回比初始值更小的值。

那么,我该如何计算时间增量,这将与系统时间无关?让这个解决方案跨平台也会很好。

+0

请发表你试过的代码。 – asgs

回答

10

用途:

System.nanoTime() 

这应该这样做。它不考虑系统时间,只能用于测量已用时间。这是你想要的。你需要除以100万来获得经过的毫秒数。另请参阅Javadocs。

+0

*它不考虑系统时间*,通常这是因为TSC是虚拟的不可靠的。看看David Holmes [高级JVM工程师,也支持RT java]博客:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks Cliff Click(原始热点架构师还在继续使用currentTimeMillis--比nanoTime便宜)。纳米时间推出时,它考虑了TSC寄存器,但在插座或节能模式中不一致。 RFE:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 – bestsss

1

使用时间Web服务。例如thisthisthis

+1

唯一的问题是,你将不得不处理网络延迟,但是处理这种问题的一个很好的解决方案 –

4
System.nanoTime(); 

Javadoc

此方法仅可用于测量经过时间与不相关的系统或挂钟时间的任何其它概念。

+0

这并不意味着nanoTime与系统时钟无关。 – bestsss

0

你可以像NTP一样安装恶魔,系统时间在任何方向跳跃都有很多问题,并可能导致相当多的其他问题。

System.nanoTime()不一定取决于系统时钟 - 但它可以 - 只是确保系统时间正常进行。 修改系统时间是一项特权操作,所以有人这样做,他们应该知道更好。

这里是一个错误就同一案件中13岁:http://bugs.sun.com/view_bug.do?bug_id=4290274

HTH