2014-03-13 46 views
2

System.currentTimeMillis()给错误的时间。 它从1980年返回时间值 通过此功能拍摄的时间值有时也与实际时间不同。 由功能时间跳跃在Android设备上?

315977198121 
315965244789 
316002166580 
315982533137 
+3

如果设备有SIM卡,它将(或应该)自动更新使用电话信号的时间。在没有SIM卡的设备(例如平板电脑)中,我看到了一些令人难以置信的时钟漂移,但没有像这样。这个代码运行在哪种设备上?或者它是一个模拟器? – CurlyPaul

+1

@CurlyPaul此代码在Android设备上运行,尤其是华为设备,不知道这里出了什么问题 – DroidBoy

+0

另外我注意到1980年1月6日的值很多 – DroidBoy

回答

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处于省电模式时也会继续保持时钟状态,所以是通用间隔时序的推荐基础。

+0

DST将*不*影响'currentTimeMillis'。时区完全不会影响它 - 这只是Unix时代以来的毫秒数。 –

+0

感谢乔恩 - 编辑答案,以明确由于夏令时导致的时间跳跃通过其他API观察到,而不是'currentTimeMillis' – zmarties

+0

正确。您可能想要现在更改第一段的结构,因为您的“各种原因”现在是1 :) –

0

返回的一些样本值尝试使用的System.nanoTime()代替System.currentTimeMillis()

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

0

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