安卓 - System.currentTimeMillis() 不按预期工作

6
我使用System.currentTimeMillis()函数来记录用户开始活动的时间。
public class TimeStamp {
protected long _startTimeMillis = System.currentTimeMillis();

public String getStartTime() {
    return new Time(_startTimeMillis).toString();
}

当活动启动并且getStartTime()返回正确的时间时,该类被实例化。我还尝试获取活动启动后经过的时间。

public String getElapsedTime() {
    return new Time(System.currentTimeMillis() - _startTimeMillis).toString();
}

在模拟的安卓设备(安卓4.0.3)上,这个功能完美地运行。但是,当我在真实的安卓设备(安卓4.0.3)上部署应用程序时,getElapsedTime()会从一个额外的小时开始计时,然后正常计数。因此,在我的真实设备上,getElapsedTime()将在活动启动后返回“01:00:01”,但它应该返回“00:00:01”。

你有任何想法为什么会发生这种情况吗?


为什么你又要创建一个新的Time()对象?只用long类型不就够了吗? - kosa
我使用 new Time() 将 long 值转换为可读的字符串。 - Jens Ehrlich
你的问题似乎与格式有关,因此解决方案可能在这里:https://dev59.com/c3VC5IYBdhLWcg3whRgw - zapl
3个回答

13

您应该使用SystemClock.uptimeMillis()

uptimeMillis()是自系统启动以来以毫秒为单位计数的,保证是单调的,而System.currentTimeMillis()不是因为用户或应用程序随时可以更改它。另外,通常启用了自动时间同步,可以随时更改时间。


SystemClock.upTimeMillis()和SystemClock.elapsedRealtime()是更好的时间测量方法,但主要问题在于格式化。 - Jens Ehrlich
如果出现“用户在 SystemClock.upTimeMillis() 开始级别,然后重新启动系统并在 SystemClock.upTimeMillis() 完成级别”的情况,这个方法/函数怎么帮助呢?我怀疑这个方法/函数不起作用,对吗? - kiranking

1

你不能使用时间来表示两个瞬间之间的差异。在你的代码中,getElapsedTime() 返回一个接近于0的时间,这被解释为1970年1月1日。我认为你遇到问题的原因是因为你的设备上没有相同的时区,因此时间的起点不是午夜。


感谢您的回答。当我启动活动时,我将时间保存为自1970年1月1日以来的毫秒数,存储在_startTime中。当我等待10秒钟时,经过了10,000毫秒。因此,在10秒后调用System.getcurrentMillis()应该返回_startTime + 10,000。两个System.getcurrentMillis()在同一时区调用,所以这不应该有影响吧? - Jens Ehrlich
如果您进行两次间隔为1秒的调用,则会获得Time(1000)。这等于1970年1月,午夜+ 1s GMT。但是,如果系统的时区不是GMT,则会得到其他结果。 - Laurent Perrin
长话短说,你不应该使用Time来处理时间差异。它只适用于绝对时间。 - Laurent Perrin

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接