【问题标题】:How can I know how much time has passed between two operations in my app? [duplicate]我如何知道我的应用程序中的两个操作之间经过了多长时间? [复制]
【发布时间】:2018-07-18 18:53:17
【问题描述】:

我正在开发一个 Android 应用程序,但我遇到了这个问题。

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

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

我不能使用System.currentTimeMillis(),因为如果用户更改日期,它就会改变。

我无法从互联网上获取日期。

谢谢

【问题讨论】:

标签: java android time timer


【解决方案1】:

使用System.currentTimeMillis()。它获取自纪元(1970 年 1 月 1 日)以来经过的时间。

你需要一个全局变量:

long start;

关于第一个动作:

start = System.currentTimeMillis();

由于是从纪元开始的时间,重启设备不会改变它(即System.nanoTime 将被重置)。但是,与大多数其他方法一样,更改设备的时间并不安全。如果有人将设备上的时间更改回纪元的开始,您将遇到一些问题。

请注意,如果时间更改,则无法获得事件发生后的确切时间。 IE。如果用户执行操作 A,等待几个小时,将时钟设置回几个小时前,基本上没有离线方式可以检查。如果您使用服务器,则可以从中获取时间,但没有任何方法可以离线获取准确的、未经修改的时差,即防篡改(篡改正在改变时间)。

TL;DR: System.currentTimeMillis 是一个离线选项,但它不安全,不受时间变化的影响。如果您需要它独立于用户更改设备时间来显示正确的时差,请使用服务器。

编辑:

如果您无法使用System.currentTimeMillis 或从互联网上获取时间,则根本无法测量时间。 AFAIK,每个 Java/Android API 都依赖于 System.currentTimeMillis (或以其他方式获取当前时间)。示例:Date 类可以转换为表示当前时间(以毫秒为单位)的 Long。对于长期计时,您必须使用 System.currentTimeMillis 或服务器。 System.nanoTime 在 JVM 重新启动时重新启动。 elapsedRealTime 也是如此。

【讨论】:

    【解决方案2】:

    您只需要在您想要计时的活动之前和之后从某个地方获取时间,然后从另一个地方获取时间。这使用系统时钟,但您同样可以从其他来源获得实时时间

        long startTime = System.currentTimeMillis();
        // Your code
        System.out.println("Operation took " + (System.currentTimeMillis() - startTime) + " milliseconds");
    

    【讨论】:

    • 你的两行是两个不同的操作,我在两个不同的类中可以在两个不同的时刻执行......也许第二个在两个月后执行。如果用户更改日期,这将不起作用。
    • 是的,吉吉,我在您进行编辑之前发布了它,其中包含了这些额外的要求。
    猜你喜欢
    • 2014-03-26
    • 2018-08-26
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2016-08-12
    • 2012-05-10
    相关资源
    最近更新 更多