如何在Android上设置Chronometer的时区?

时间:2013-06-11 22:12:57

标签: android chronometer

天文台的滴答作响 但是当我试图通过使用下面的公式来获得多长时间时。

%% 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));

        }});

1 个答案:

答案 0 :(得分:1)

Chronometer.getBase()返回一个长整数,表示它的基础的UTC时间 - 在你的情况下,是计时表的构建时间。

这不是你的主要问题,但为了准确,你应该调用

 jobTimerDisplay.setBase(System.currentTimeMillis());

之前

jobTimerDisplay.start();

以便您参考开始时间而不是计时器的构建时间。

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

您可能想要的是将天文台的基准时间与当前时间进行比较:

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

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

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