5

在 Chronometer 中,我们如何提取经过的时间并将其单独存储在变量中。

例如,将经过的小时数、分钟数、秒数存储在单独的 int 变量中?

是否可以?如果是,如何?

除了 Chronometer 之外,使用其他概念可以更好地完成吗?如果是,那是什么?

4

3 回答 3

15

您可以获得时间值(以毫秒为单位):

long timeElapsed = SystemClock.elapsedRealtime() - chrono.getBase();

然后您可以简单地检索小时、分钟和秒,如下所示:

long timeElapsed = 7564000; //For example
int hours = (int) (timeElapsed / 3600000);
int minutes = (int) (timeElapsed - hours * 3600000) / 60000;
int seconds = (int) (timeElapsed - hours * 3600000 - minutes * 60000) / 1000;
//hours = 2
//minutes = 6
//seconds = 4
于 2012-11-08T19:36:51.087 回答
3

我突然想到了几个想法:

  • Chronometer 扩展了 TextView,因此使用getText()并解析每个时间":"(或任何本地时间分隔符)。
  • 您还可以自己计算当前时间(以毫秒为单位),将其传递给 Java Calendar 对象并使用它的get()方法:

    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    calendar.setTimeInMillis(SystemClock.elapsedRealtime() - chronometer.getBase());
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    // etc
    
于 2012-11-08T18:16:02.523 回答
-1

您也可以创建自己的 Chronometer,这是一个我用作倒数计时器的示例,但想法是相反的,您只需要更改 CountQueue CountDownTimer 以添加分钟和小时而不是减去它们,更改@Override onTick 将 iSec 存储为 60 减去当前值并将“void setTimeText()”更改为您想要显示的值。setTrainingCountdown() 也应该改变,所以它默认从 0 开始。

要使用它,您只需在创建新 SkillQCountdown 时绑定任何 TextView 并使用 setTrainingCountdown() 启动它,您可能想要创建一种暂停和重新启动计时器的方法(只需停止计时器并存储值,然后使用存储的值重新启动) . 如果您还想存储和显示毫秒,请更改此行“counter = new CountQueue(60000, 100);” 因此您可以每秒注册一次 onTick 而不是每 60 秒一次,第二个值是它尝试使用新值更新 TextView 的频率。

但是,如果您只想精确存储值,则可以在计数开始时以毫秒为单位获取当前时间,并且无论何时要获取值,然后减去该值并计算秒、分钟和小时,就像您可以看到它是在“public void setTrainingCountdown(long diffInMis)”中完成的

public class SkillQCountdown {

    int iDay,iHour,iMin,iSec;
    CountQueue counter;
    NumberFormat myFormat = NumberFormat.getInstance();

    Context mContext;
    private TextView text = null;

    public SkillQCountdown(Context context, TextView text){
        mContext = context;
        this.text = text;
    }

    public void setTrainingCountdown(long diffInMis) {
        myFormat.setMinimumIntegerDigits(2);

        try {
            if(diffInMis < 0) {
                Toast.makeText(mContext, "Skill Queue unsynchronized"
                        ,Toast.LENGTH_SHORT).show();

            }else {             
                long diff = TimeUnit.MILLISECONDS.toSeconds(diffInMis);
                iDay = (int) (diff/(60*60*24));

                long lday = (diff%(60*60*24));
                iHour = (int)(lday/3600);

                long lhour = (lday%(60*60));
                iMin = (int)(lhour/60);

                long lmin= (lhour%(60));
                iSec = (int)(lmin);

                setTimeText();

                counter = new CountQueue(iSec*1000, 100);
                counter.start();}

        } catch (ParseException e) {
            e.printStackTrace();
        }    
    }

    private void setTimeText() {
        StringBuilder sb = new StringBuilder();
        String strText = null;

        if (iDay > 0) {
            sb.append(myFormat.format(iDay));
            if (iDay == 1) {
                sb.append(" day ");
            }else {
                sb.append(" days ");
            }
        }

        if (iHour > 0 || iDay > 0) {
            sb.append(myFormat.format(iHour));
            if (iHour == 1) {
                sb.append(" hour ");
            }else {
                sb.append(" hours ");
            }
        }

        if (iMin > 0 || iHour > 0 || iDay > 0) {
            sb.append(myFormat.format(iMin));
            if (iMin == 1) {
                sb.append(" minute ");
            }else {
                sb.append(" minutes ");
            }
        }

        if (iSec > 0 || iMin > 0 || iHour > 0 || iDay > 0) {
            sb.append(myFormat.format(iSec));
            sb.append(" seconds");
            strText = sb.substring(0);
        }else {
            strText = mContext.getString(R.string.msg_skillQueueEmpty);
        }

        text.setText(strText);
    }

    private class CountQueue extends CountDownTimer{
        public CountQueue(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }
        @Override
        public void onFinish() {
            iSec = 0;
            setTimeText();

            counter = new CountQueue(60000, 100);
            counter.start();
            iMin-=1;

            if(iMin < 0 && (iHour > 0 || iDay > 0)) {
                iMin=59;
                iHour-=1;

                if(iHour < 0 && iDay > 0) {
                    iHour=23;
                    iDay-=1;
                }
            }
        }

        @Override
        public void onTick(long millisUntilFinished) {
            if (Math.floor((float)millisUntilFinished / 1000.0f) != iSec) {  
                iSec = (int) Math.floor((float)millisUntilFinished / 1000.0f);
                setTimeText();
             }
        }
    }

}
于 2012-11-08T19:44:24.443 回答