天文台的滴答作响 但是当我试图通过使用下面的公式来获得多长时间时。
%% 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));
}});
答案 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类,在这种情况下,我建议将它重命名为避免混淆)。