Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.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
Java计时,System.nanoTime()比System.currentTimeMillis()好,但它会在睡眠中持续吗?_Java_Android_Timer_Time Precision - Fatal编程技术网

Java计时,System.nanoTime()比System.currentTimeMillis()好,但它会在睡眠中持续吗?

Java计时,System.nanoTime()比System.currentTimeMillis()好,但它会在睡眠中持续吗?,java,android,timer,time-precision,Java,Android,Timer,Time Precision,我正在尝试实现一个计时器,它可以用于短(秒)事件,或更长(小时等)事件 理想情况下,它应该在CPU关闭时持续一段时间,例如,电池耗尽。如果我使用System.currentTimeMillis()设置开始时间,使用相同的函数设置结束时间,则它几乎在所有情况下都有效,但闰秒、闰年、夏令时更改等期间除外。。。或者,如果用户只是更改了时间(我已经验证了这一点)。顺便说一句,这是安卓系统 相反,如果我使用System.nanoTime(),除了可能更准确之外,它不会有时间变化等常见的“困难时间”问题。我

我正在尝试实现一个计时器,它可以用于短(秒)事件,或更长(小时等)事件

理想情况下,它应该在CPU关闭时持续一段时间,例如,电池耗尽。如果我使用System.currentTimeMillis()设置开始时间,使用相同的函数设置结束时间,则它几乎在所有情况下都有效,但闰秒、闰年、夏令时更改等期间除外。。。或者,如果用户只是更改了时间(我已经验证了这一点)。顺便说一句,这是安卓系统

相反,如果我使用System.nanoTime(),除了可能更准确之外,它不会有时间变化等常见的“困难时间”问题。我的问题是,System.nanoTime()是否在“困难时间”中从任意时间测量纳秒?我不确定正确的术语是什么,但例如,System.nanoTime()是否会在X运行,然后在X+1小时后,系统关闭(例如Android设备上的电池已耗尽),然后X+10小时,系统启动,此时运行System.nanoTime()是否会返回10小时?或者它会返回1小时(因为当系统关闭/休眠时,nanoTime使用的“计数器”可能没有运行?)。

它:

“返回的值表示纳秒,因为某些固定但 任意起始时间(可能在将来,因此值可能为 否定)。此方法的所有调用都使用相同的源 在Java虚拟机的实例中;其他虚拟机 实例可能使用不同的原点。”

为了简单起见,我们会说,当您在时间X运行它时,原点是X(这是允许的)。这意味着它将返回0,然后在VM实例中,时间将以与正常时钟相同的速率流逝

当您使用
Thread.sleep
时,这不会改变VM实例,因此不会对其进行特殊处理


但是,设备重新启动后,您将处于不同的VM实例中。因此,不再保证X是源。

android.os.SystemClock.elapsedRealtime()-系统启动后的毫秒,包括处于睡眠状态的时间。这应该是你最好的选择

我认为你无法测量android系统的关闭时间


要了解更多信息,最好查看android系统时钟页面

随着时间的变化,它不会出现通常的“困难时期”问题,“不明白你为什么这么想。所有时间的绝对度量都需要更高级别的API来解释,以便准确地将夏时制之类的东西转换为人类时间会计。我的意思是,我不关心绝对时间中的时间会计。我只关心过去的时间。此应用程序将像烹饪计时器一样使用。如果用户在计时器的开始和停止之间重新启动、关闭、调整时钟等,计时器应该仍然工作。似乎nanoTime()允许用户调整时钟并仍然工作,但不允许重新启动/关闭,而currentTimeMillis将用于重新启动/关闭,但不允许用户调整时钟。我们真的希望nanoTime()能起作用,因为nanoTime的定义说它来自任意的起始时间,我们希望这个起始时间在一台机器上是恒定的,并且在机器重新启动时不会改变,等等……啊,谢谢,所以它不会在机器关机时持续。此计时功能的目的是对任何事物进行计时,从开始到停止。不保证在启动和停止之间会发生什么(理论上,用户可以重新启动机器,关闭机器一小时,将系统时钟提前一小时等等)。啊,是的,我已经看过了,这看起来是一个很好的解决方案。nanoTime()会更准确吗?elapsedRealtime()似乎与nanoTime()类似,只是毫秒精度与纳米精度不同,elapsedRealtime()有一组起始引用(系统启动)与任意起始引用。从这里可以看出:system.nanoTime()似乎使用了时钟单调的clock_gettime()。当设备进入深度睡眠时,时钟停止,因此nanoTime()无法工作。我认为elapsedRealtime()是最好的解决方案,因为它只在系统关闭时才起作用。我会用这个的,谢谢!