我正在使用Android应用,我遇到了这个问题。
例如,如果我删除一个文件(操作A)并且我收到一个新文件(操作B),我想知道这两个操作之间已经过了多少时间。如果用户之间更改系统日期,关闭互联网或重新启动设备,我希望它也能正常工作。
我知道存在SystemClock.elapsedRealtime()
,但如果用户重新启动设备,则其值将从零重新开始。
我无法使用System.currentTimeMillis()
,因为如果用户更改日期,则会更改。
我无法通过互联网获取约会。
由于
答案 0 :(得分:1)
使用System.currentTimeMillis()
。它获得了自纪元(1970年1月1日)以来的时间。
您需要一个全局变量:
long start;
关于第一个动作:
start = System.currentTimeMillis();
由于是从纪元开始的时间,重启设备不会改变它(即System.nanoTime
将被重置)。但是,与大多数其他方法一样,更改设备的时间并不安全。如果有人将设备上的时间更改回时代的开头,您将遇到一些问题。
请注意,如果时间发生变化,则无法获得自事件发生以来的确切时间。即如果用户进行操作A,等待几个小时,将时钟设置回几个小时前,基本上没有离线方法可以检查。如果您使用服务器,您可以从中获取时间,但没有任何方法可以获得离线的准确,未修改的时差,这是防篡改(篡改改变时间)。
TL; DR: System.currentTimeMillis
是一个离线选项,但从时间变化来看并不安全。如果您需要它来显示正确的时差,而不是用户更改设备的时间,请使用服务器。
修改强>
如果您无法使用System.currentTimeMillis
或从互联网上获取时间,则无法衡量时间。 AFAIK,每个Java / Android API都依赖于System.currentTimeMillis(或以其他方式获取当前时间)。示例:Date类可以转换为Long,表示当前时间(以毫秒为单位)。对于长期计时,您必须使用System.currentTimeMillis或服务器。 JVM重新启动时会重新启动System.nanoTime
。 elapsedRealTime也是如此。
答案 1 :(得分:0)
你只需要从你想要的活动之前和之后的某个地方获取时间,然后从另一个活动中取出一个。这使用系统时钟,但您可以从其他来源获得实时
long startTime = System.currentTimeMillis();
// Your code
System.out.println("Operation took " + (System.currentTimeMillis() - startTime) + " milliseconds");