【问题标题】:System.currentTimeMillis(); If I change system timeSystem.currentTimeMillis();如果我更改系统时间
【发布时间】:2013-03-25 16:56:20
【问题描述】:

如果我在 00:00 使用 System.currentTimeMillis() 并得到 X 值。

然后我将时钟拨回一小时,一小时后我打电话给System.currentTimeMillis()

它会再次返回X,还是只是X + 3600 * 1000

【问题讨论】:

  • 根据 javadoc,它返回 当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。 => 所以你可以期待它如果您更改计算机的时钟,则会进行调整。
  • 不保证,我相信。在不同的系统上,JDK 必须通过不同的循环来获取系统时间,并且可能并不总是立即响应系统时钟的变化。

标签: java time


【解决方案1】:

简而言之,每当您更改系统时间时,System.currentTimeMillis() 返回的值都会相应更改。

这与System.nanoTime() 形成对比。

【讨论】:

  • 我知道 nanoTime(),但我读到它比 currentTimeMillis 贵 20 倍,所以我宁愿避免这种情况。我不需要太多的精度(半秒的错误可能非常好)。有没有其他选择,或者我应该只使用 nanoTime?
  • @TwinOneAndroid 20 次几个 cpu 周期仍然不多,除非你每秒调用它数千次......更多关于它here.
  • @TwinOneAndroid 为了测量时间跨度,我相信你应该总是使用nanoTime()。 (不记得确切的原因,这与系统时间在某些方面的行为违反直觉有关。因此,对此持保留态度。)
  • nanoTime() 的要点是,当系统时钟以某种方式调整时它不会改变,因此两个时间戳相隔一段时间将正确反映该时间跨度,无论时钟调整。
  • @HotLicks 另一个问题是currentTimeMillis() 的粒度取决于操作系统,而实际上,nanoTime() 的分辨率应该低于 1 毫秒。 (通过code.google.com/p/javasimon/wiki/SystemTimersGranularity
【解决方案2】:

它将返回 X,因为 System.currentTimeMillis() 返回自纪元以来的毫秒数。这意味着它将与您的时钟不同步并计算自 1970 年 1 月 1 日 UTC 以来的秒数

【讨论】:

    【解决方案3】:

    在 Android 上,您始终可以使用SystemClock.elapsedRealtime()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多