我怎么知道我的应用程序中两次操作之间已经过了多少时间?

时间:2018-02-08 09:04:18

标签: java android time timer

我正在使用Android应用,我遇到了这个问题。

例如,如果我删除一个文件(操作A)并且我收到一个新文件(操作B),我想知道这两个操作之间已经过了多少时间。如果用户之间更改系统日期,关闭互联网或重新启动设备,我希望它也能正常工作。

我知道存在SystemClock.elapsedRealtime(),但如果用户重新启动设备,则其值将从零重新开始。

我无法使用System.currentTimeMillis(),因为如果用户更改日期,则会更改。

我无法通过互联网获取约会。

由于

2 个答案:

答案 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");