Java 显示天数、小时数。。。在安卓(天文计)上已经过了一段时间

Java 显示天数、小时数。。。在安卓(天文计)上已经过了一段时间,java,android,Java,Android,我已经使用倒计时计时器和大量来自此答案的代码对未来日期(剩余的天、小时、分钟、秒)进行了倒计时: 现在我想做完全相同的事情,但从过去的日期开始计算。我的文本视图应每秒刷新一次,并显示经过的时间。 我的尝试: 我试着操纵倒计时,使它以相反的顺序工作。将间隔更改为-1000或每秒增加2000毫秒的倒计时。两个都不起作用。 然后我想我应该用天文钟。就我而言,标准的计时器只能显示小时、分和秒。所以没有日子了。然后,我以我在使用所需数据更新TextView之前找到的倒计时答案的样式编写了以下代码:

我已经使用倒计时计时器和大量来自此答案的代码对未来日期(剩余的天、小时、分钟、秒)进行了倒计时: 现在我想做完全相同的事情,但从过去的日期开始计算。我的文本视图应每秒刷新一次,并显示经过的时间。

我的尝试:
我试着操纵倒计时,使它以相反的顺序工作。将间隔更改为-1000或每秒增加2000毫秒的倒计时。两个都不起作用。
然后我想我应该用天文钟。就我而言,标准的计时器只能显示小时、分和秒。所以没有日子了。然后,我以我在使用所需数据更新TextView之前找到的倒计时答案的样式编写了以下代码:

    final Chronometer ch = (Chronometer) findViewById(R.id.ch_chronometer);
    final TextView tv = (TextView) findViewById(R.id.tv_show_stopwatch);

    ch.setBase(endMillis); //endMillis is the date in Milliseconds

    chCountdownSince.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
        public void onChronometerTick(Chronometer cArg) {
            long t = System.currentTimeMillis() - chCountdownSince.getBase();

            long days = TimeUnit.MILLISECONDS.toDays(t);
            t -= TimeUnit.DAYS.toMillis(days);

            long hours = TimeUnit.MILLISECONDS.toHours(t);
            t -= TimeUnit.HOURS.toMillis(hours);

            long minutes = TimeUnit.MILLISECONDS.toMinutes(t);
            t -= TimeUnit.MINUTES.toMillis(minutes);

            long seconds = TimeUnit.MILLISECONDS.toSeconds(t);
            String stopwatchDisplay = "Days: %d Hours: %d Minutes: %d Seconds: %d";
            stopwatchDisplay = String.format(stopwatchDisplay, days, hours, minutes, seconds);
            tv.setText(stopwatchDisplay);
        }
    });
我觉得这个被剪掉的部分绝对有意义,但在执行时它根本不会改变我的文本视图。我觉得这不是计时器的工作原理,但我不知道我做错了什么

编辑:

我想你完全忘记启动计时器了。

对onTick(long)的调用将同步到此对象,以便 调用onTick(long)不会在上一次回调之前发生 完成

不太可能在UI线程上完成标记,但这正是您需要设置文本的地方,请尝试更改

tv.setText(stopwatchDisplay);

请使用处理器

public void countDownStart() {
    handler = new Handler();
    runnable = new Runnable(){
        @Override
        public void run(){
            handler.postDelayed(this,1000);
            try {
                FestCountdownTimer timer = new FestCountdownTimer(00, 00, 9, 3, 01, 2017);
                new CountDownTimer(timer.getIntervalMillis(), 1000) {
                    @Override
                    public void onTick(long millisUntilFinished){
                        int days = (int) ((millisUntilFinished / 1000) / 86400);
                        int hours = (int) (((millisUntilFinished / 1000)
                                - (days * 86400)) / 3600);
                        int minutes = (int) (((millisUntilFinished / 1000)
                                - (days * 86400) - (hours * 3600)) / 60);
                        int seconds = (int) ((millisUntilFinished / 1000) % 60);
                        String countdown = String.format("%02dd %02dh %02dm %02ds", days,
                                hours, minutes, seconds);
                        txtTimerDay.setText("" + String.format("%02d", days));
                        txtTimerHour.setText("" + String.format("%02d", hours));
                        txtTimerMinute.setText(""
                                + String.format("%02d", minutes));
                        txtTimerSecond.setText(""
                                + String.format("%02d", seconds));
                    }
                    @Override
                    public void onFinish() {
                        textViewGone();
                MainActivity.aSwitch.setChecked(false);
        creditText.setText("Toggle On To Start");
                    }
                }.start();
            } catch (Exception e) {
                e.printStackTrace();                }
        }
    };
    handler.postDelayed(runnable, 1 * 1000);

}
记住,
9是小时,3是日期,1是二月
。月份从
0索引开始

倒数计时器类

public class FestCountdownTimer {
    private long intervalMillis;
    public FestCountdownTimer(int second, int minute, int hour, int monthDay, int month, int year) {
        Time futureTime = new Time();
        // Set date to future time
        futureTime.set(second, minute, hour, monthDay, month, year);
        futureTime.normalize(true);
        long futureMillis = futureTime.toMillis(true);
        Time timeNow = new Time();
        // Set date to current time
        timeNow.setToNow();
        timeNow.normalize(true);
        long nowMillis = timeNow.toMillis(true);
        // Subtract current milliseconds time from future milliseconds time to retrieve interval
        intervalMillis = futureMillis - nowMillis;
    }
    public long getIntervalMillis() {
        return intervalMillis;
    }
}

希望有帮助……)

谢谢,但不幸的是,这似乎没有什么区别。此外,我还必须将字符串更改为final bt您在调试器和/或日志下检查了什么,您得到了任何记号?它根本没有进入“onChronometerTick”方法。你知道它为什么不进吗?我没看到你在计时钟上叫开始…我现在觉得很愚蠢…但是的,它现在起作用了!非常感谢。(你应该写下来作为答案,我会接受它作为解决方案)谢谢!时间()不是被弃用了吗?我想避免这种情况。我让它运行,将计时器设置为过去的日期(因为这是我想要的),并将
Timer.getIntervalMillis()
设置为负数。它告诉我正确的时间,但秒和分钟有点“抽搐”。计时器运行的时间越长,效果越差。一段时间后,秒数无法读取,因为它们每秒更改值50次。
public class FestCountdownTimer {
    private long intervalMillis;
    public FestCountdownTimer(int second, int minute, int hour, int monthDay, int month, int year) {
        Time futureTime = new Time();
        // Set date to future time
        futureTime.set(second, minute, hour, monthDay, month, year);
        futureTime.normalize(true);
        long futureMillis = futureTime.toMillis(true);
        Time timeNow = new Time();
        // Set date to current time
        timeNow.setToNow();
        timeNow.normalize(true);
        long nowMillis = timeNow.toMillis(true);
        // Subtract current milliseconds time from future milliseconds time to retrieve interval
        intervalMillis = futureMillis - nowMillis;
    }
    public long getIntervalMillis() {
        return intervalMillis;
    }
}