在Android设备上跳时间吗?

时间:2014-03-13 11:29:11

标签: android dalvik ntp

System.currentTimeMillis()给出了错误的时间。 它返回1980年的时间值 通过此功能获取的时间值有时也与实际时间不同。 函数返回的一些样本值

315977198121
315965244789
316002166580
315982533137

3 个答案:

答案 0 :(得分:3)

是的,System.currentTimeMillis()返回的时间可以跳转,例如因为设备时钟可能已经漂移,并且由于从网络获取准确时间而被重置

通过其他API观察到的时间也可能会跳得更多,例如由于时区变化或夏令时。

(但这并不能解释为什么你在1980年突然看到时间。坦率地说这听起来像是设备错误。)

您声明您正在使用该值来获取持续时间。这是一个错误 - 您应该使用SystemClock.elapsedRealtime()进行持续时间计算。

请参阅SystemClock上的文档,其中特别注明:

Three different clocks are available, and they should not be confused:
  • System.currentTimeMillis()是标准"墙"时钟(时间和日期)表示自纪元以来的毫秒数。挂钟可以由用户或电话网络设置(请参阅setCurrentTimeMillis(long)),因此时间可能会不可预测地向后或向前跳转。只有在与实际日期和时间对应很重要时,例如在日历或闹钟应用程序中,才应使用此时钟。间隔或经过时间测量应使用不同的时钟。如果您正在使用System.currentTimeMillis(),请考虑侦听ACTION_TIME_TICK,ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED Intent广播,以找出时间的变化。

  • uptimeMillis()以系统启动后的毫秒数计算。当系统进入深度睡眠状态(CPU关闭,显示较暗,设备等待外部输入)时,此时钟停止,但不受时钟缩放,空闲或其他省电机制的影响。这是大多数间隔时间的基础,例如Thread.sleep(millls),Object.wait(millis)和System.nanoTime()。该时钟保证是单调的,当间隔不跨越设备睡眠时,适用于间隔定时。大多数接受时间戳值的方法当前都需要uptimeMillis()时钟。

  • elapsedRealtime()和elapsedRealtimeNanos()返回自系统启动以来的时间,并包括深度睡眠。该时钟保证是单调的,即使在CPU处于省电模式时也会继续打勾,因此是通用间隔时序的推荐基础。

答案 1 :(得分:0)

尝试使用System.nanoTime()代替System.currentTimeMillis()

System.currentTimeMillis()的文档似乎表明它不应该用于计算已用时间!

答案 2 :(得分:0)

你可以在动作' android.intent.action.TIME_SET'上创建broadcastreceiver。您可以知道设备上的时间何时发生变化(通过其他应用程序)。