Android - 在计时器中计算时间

时间:2012-11-08 18:11:48

标签: java android time timer chronometer

在天文台中,我们如何提取经过的时间并将其分别存储在变量中。

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

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

除了天文台表,使用其他概念可以做得更好吗?如果是,那是什么?

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:3)

一些想法突然出现在我身上:

  • 计时器扩展了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
    

答案 2 :(得分:-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();
             }
        }
    }

}