【问题标题】:Android - calculations with time elapsed in the ChronometerAndroid - 在 Chronometer 中计算经过的时间
【发布时间】:2012-11-08 18:11:47
【问题描述】:

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

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

有可能吗?如果是,如何?

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

【问题讨论】:

    标签: java android time timer chronometer


    【解决方案1】:

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

    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
    

    【讨论】:

    • @我不确定这是不是最好的方法,性能方面
    【解决方案2】:

    我突然想到了几个想法:

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

      Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
      calendar.setTimeInMillis(SystemClock.elapsedRealtime() - chronometer.getBase());
      int hour = calendar.get(Calendar.HOUR_OF_DAY);
      // etc
      

    【讨论】:

    • 然后,我们可以使用字符串操作选项吗?对吗?
    • 是的,您可以对getText().toString() 执行任何字符串操作。
    • 能否请您详细说明您的答案。通过提供更多代码。
    【解决方案3】:

    您也可以创建自己的 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();
                 }
            }
        }
    
    }
    

    【讨论】:

    • 简单任务的复杂性
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多