0

计时表的滴答声正在工作但是当我尝试使用以下公式计算经过了多少时间时。

%% SystemClock.elapsedRealtime() - cArg.getBase()

它增加了 12 小时(分钟和秒是精确的)

看来我必须设置时区。但我不知道我应该怎么做。请帮助我。

private Chronometer jobTimerDisplay;
protected void onCreate(Bundle savedInstanceState) {
jobTimerDisplay = (Chronometer) findViewById(R.id.chronometer_Working);
jobTimerDisplay.start();
}


jobTimerDisplay.setOnChronometerTickListener(new OnChronometerTickListener() {
public void onChronometerTick(Chronometer cArg) {

         long t = SystemClock.elapsedRealtime() - cArg.getBase();
         sec.setText(DateFormat.format("ss", t));
         min.setText(DateFormat.format("mm", t));
         hour.setText(DateFormat.format("h", t));

        }});
4

1 回答 1

1

Chronometer.getBase() 返回一个 long 表示其基准的 UTC 时间 - 在您的情况下,是 Chronometer 的构建时间。

这不是您的主要问题,但为了准确起见,您可能应该调用

 jobTimerDisplay.setBase(System.currentTimeMillis());

就在之前

jobTimerDisplay.start();

这样您就可以参考开始时间而不是 Chronometer 的构建时间。

真正的问题是您将 Chronometer 的基本时间(这是一个绝对时间点)与 Android 设备运行的时间长度进行比较。

您可能想要将 Chronometer 的基准时间与当前时间进行比较:

 long elapsedTime = System.getCurrentTimeMillis() - cArg.getBase();

请注意,Java(和大多数语言)中的日期没有时区。日期将它们的时间存储为与 Java Epoch 日期的长偏移量,以 UTC 为单位。在格式化 Date 之前,您不会获得时区,无论是通过显式格式化它,还是通过显式或隐式调用它的 toString() 方法,比如在System.out.println语句中使用它。

一旦你解决了这个问题,你可以继续处理 DateFormat 类不格式化 long 的事实,它格式化 Dates(除非你有一个自定义 DateFormat 类,在这种情况下,我建议重命名它以避免混淆) .

于 2013-06-11T22:47:16.437 回答