【发布时间】:2012-06-18 22:09:43
【问题描述】:
我正在尝试实现一个计时器,它可能用于短(秒)事件或更长(小时等)事件。
理想情况下,它应该在 CPU 关闭的一段时间内持续存在,例如,电池没电了。如果我使用 System.currentTimeMillis() 设置开始时间并使用相同的函数设置结束时间,它几乎适用于所有情况,除了在闰秒、闰年、夏令时更改等期间...或者,如果用户只是更改时间(我已经验证了这一点)。顺便说一句,这是在 Android 系统上。
相反,如果我使用 System.nanoTime(),除了可能更准确之外,它不会出现时间变化等常见的“困难时间”问题。我的问题是,System.nanoTime()在“困难时期”从某个任意时间测量纳秒?我不确定正确的术语是什么,但例如,System.nanoTime() 会在 X 处运行,然后 X+1 小时后,系统关闭(例如,Android 设备上的电池没电了),然后是 X +10 小时,系统启动,此时运行 System.nanoTime() 会返回 10 小时吗?或者它会返回 1 小时(因为 nanoTime 使用的“计数器”在系统关闭/休眠时可能不会运行?)。
【问题讨论】:
-
“它不会有通常的“困难时间”问题随着时间的变化,”不明白你为什么这么认为。所有绝对时间度量都需要更高级别的 API 进行解释,才能准确地转化为人类时间,以考虑夏令时等因素。
-
我的意思是,我不关心绝对时间的时间计算。我只关心经过的时间。此应用程序将用作烹饪计时器。如果用户在定时器的启动和停止之间重启、关闭、调整时钟等,定时器应该仍然工作。
-
似乎 nanoTime() 将允许用户调整时钟并且仍然可以工作,但不适用于重启/关机,而 currentTimeMillis 将适用于重启/关机,但不适用于用户调整时钟。真的希望 nanoTime() 能工作,因为 nanoTime 的定义说它来自任意的起始时间,希望这个起始时间在一台机器上是恒定的,并且在机器重新启动时不会改变,等等......
标签: java android timer time-precision