【问题标题】:Android Countdown Timer to Date迄今为止的 Android 倒数计时器
【发布时间】:2012-08-09 01:05:01
【问题描述】:

我正在尝试在 android 中为游戏/日期制作倒数计时器。我想创建一个计时器,显示天、小时、分钟和秒到我用 final 变量指定的日期。然后计时器设置文本视图以向用户显示天、小时、分钟和秒。

关于如何编写代码有什么建议吗?

【问题讨论】:

标签: java android eclipse android-layout android-intent


【解决方案1】:

CountDownTimer 将显示格式为小时、分钟、天和秒的时间。

 public class DemotimerActivity extends Activity {
        /** Called when the activity is first created. */
         TextView tv;
         long diff;
         long oldLong;
         long NewLong;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            tv = new TextView(this);
            this.setContentView(tv);
            SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
            String oldTime = "19.02.2018, 12:00";//Timer date 1
            String NewTime = "20.02.2018, 14:00";//Timer date 2
            Date oldDate, newDate;
            try {
                oldDate = formatter.parse(oldTime);
                newDate = formatter.parse(NewTime);
                oldLong = oldDate.getTime();
                NewLong = newDate.getTime();
                diff = NewLong - oldLong;
           } catch (ParseException e) {
                e.printStackTrace();
       }
         MyCount counter = new MyCount(diff, 1000);
         counter.start();
    }


    // countdowntimer is an abstract class, so extend it and fill in methods
    public class MyCount extends CountDownTimer {
    MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        txtNumber1.setText("done!");
    }

    @Override
    public void onTick(long millisUntilFinished) {
         long millis = millisUntilFinished;
        String hms = (TimeUnit.MILLISECONDS.toDays(millis)) + "Day "
                + (TimeUnit.MILLISECONDS.toHours(millis) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millis)) + ":")
                + (TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) + ":"
                + (TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
        txtNumber1.setText(/*context.getString(R.string.ends_in) + " " +*/ hms);
    }
}

    }

【讨论】:

  • 它实际上是增加时间计数器而不是递减计数器。
  • 这个内部类可能会比包含的活动更长寿(如果您在计时器完成之前离开活动),从而导致内存泄漏。请务必取消计时器并删除任何对 onPause 或 onStop 的引用。
  • 简直完美,这就是我要找的那个。
  • 如果我们每天都这样做呢?它将在上午 11:15 开始,并将在第二天上午 11:00 结束,然后在上午 11:15 重新开始时区。有可能吗?
【解决方案2】:

试试这个:

SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
        formatter.setLenient(false);


        String endTime = "25.06.2017, 15:05:36"

        Date endDate;
        try {
            endDate = formatter.parse(endTime);
            milliseconds = endDate.getTime();

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

         startTime = System.currentTimeMillis();

         diff = milliseconds - startTime;


           mCountDownTimer = new CountDownTimer(milliseconds, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {

                startTime=startTime-1;
                Long serverUptimeSeconds =
                        (millisUntilFinished - startTime) / 1000;

                String daysLeft = String.format("%d", serverUptimeSeconds / 86400);
                txtViewDays.setText(daysLeft);

                String hoursLeft = String.format("%d", (serverUptimeSeconds % 86400) / 3600);
                txtViewHours.setText(hoursLeft);

                String minutesLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) / 60);

                txtViewMinutes.setText(minutesLeft);

                String secondsLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) % 60);
                txtViewSecond.setText(secondsLeft);


            }

            @Override
            public void onFinish() {

            }
        }.start();

    }

【讨论】:

  • 如果我不想要几天,只想要几小时、几分钟和几秒呢?
【解决方案3】:

这是一个 Android 内置的 CountDownTimer,它将在 TextView 中显示格式化为您的天、小时、分钟和秒的时间:

public class Example extends Activity {
    CountDownTimer mCountDownTimer;
    long mInitialTime = DateUtils.DAY_IN_MILLIS * 2 + 
                        DateUtils.HOUR_IN_MILLIS * 9 +
                        DateUtils.MINUTE_IN_MILLIS * 3 + 
                        DateUtils.SECOND_IN_MILLIS * 42;
    TextView mTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTextView = (TextView) findViewById(R.id.empty);

        mCountDownTimer = new CountDownTimer(mInitialTime, 1000) {
            StringBuilder time = new StringBuilder();
            @Override
            public void onFinish() {
                mTextView.setText(DateUtils.formatElapsedTime(0));
                //mTextView.setText("Times Up!");
            }

            @Override
            public void onTick(long millisUntilFinished) {
                time.setLength(0);
                 // Use days if appropriate
                if(millisUntilFinished > DateUtils.DAY_IN_MILLIS) {
                    long count = millisUntilFinished / DateUtils.DAY_IN_MILLIS;
                    if(count > 1)
                        time.append(count).append(" days ");
                    else
                        time.append(count).append(" day ");

                    millisUntilFinished %= DateUtils.DAY_IN_MILLIS;
                }

                time.append(DateUtils.formatElapsedTime(Math.round(millisUntilFinished / 1000d)));
                mTextView.setText(time.toString());
            }
        }.start();
    }
}

【讨论】:

  • 天数总是+1 可以减少吗?
  • 这种方法在我的模拟器上每分钟最多跳过 3 秒。它不是在我的手机上做的。这是一个模拟器问题,还是我应该期望在其他手机上发生这种情况?。
  • 如果您选择为此添加月份会怎样?
【解决方案4】:

这也是 kotlin 中的一个例子

fun printDifferenceDateForHours() {

        val currentTime = Calendar.getInstance().time
        val endDateDay = "03/02/2020 21:00:00"
        val format1 = SimpleDateFormat("dd/MM/yyyy hh:mm:ss",Locale.getDefault())
        val endDate = format1.parse(endDateDay)

        //milliseconds
        var different = endDate.time - currentTime.time
        countDownTimer = object : CountDownTimer(different, 1000) {

            override fun onTick(millisUntilFinished: Long) {
                var diff = millisUntilFinished
                val secondsInMilli: Long = 1000
                val minutesInMilli = secondsInMilli * 60
                val hoursInMilli = minutesInMilli * 60
                val daysInMilli = hoursInMilli * 24

                val elapsedDays = diff / daysInMilli
                diff %= daysInMilli

                val elapsedHours = diff / hoursInMilli
                diff %= hoursInMilli

                val elapsedMinutes = diff / minutesInMilli
                diff %= minutesInMilli

                val elapsedSeconds = diff / secondsInMilli

                txt_timeleft.text = "$elapsedDays days $elapsedHours hs $elapsedMinutes min $elapsedSeconds sec"
            }

            override fun onFinish() {
                txt_timeleft.text = "done!"
            }
        }.start()
    }

【讨论】:

【解决方案5】:

long startTime;

private void start_countdown_timer()
{
    SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
    formatter.setLenient(false);


    String endTime = "18.09.2017, 15:05:36";
    long milliseconds=0;

    final CountDownTimer mCountDownTimer;

    Date endDate;
    try {
        endDate = formatter.parse(endTime);
        milliseconds = endDate.getTime();

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    startTime = System.currentTimeMillis();


    mCountDownTimer = new CountDownTimer(milliseconds, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {

            startTime=startTime-1;
            Long serverUptimeSeconds =
                    (millisUntilFinished - startTime) / 1000;

            String daysLeft = String.format("%d", serverUptimeSeconds / 86400);
            //txtViewDays.setText(daysLeft);
            Log.d("daysLeft",daysLeft);

            String hoursLeft = String.format("%d", (serverUptimeSeconds % 86400) / 3600);
            //txtViewHours.setText(hoursLeft);
            Log.d("hoursLeft",hoursLeft);

            String minutesLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) / 60);
            //txtViewMinutes.setText(minutesLeft);
            Log.d("minutesLeft",minutesLeft);

            String secondsLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) % 60);
            //txtViewSecond.setText(secondsLeft);
            Log.d("secondsLeft",secondsLeft);


        }

        @Override
        public void onFinish() {

        }
    }.start();


}

【讨论】:

    【解决方案6】:

    我已经阅读了您的问题,我已经遇到过这个问题,并且我为它制作了自定义代码,而没有使用任何第三方库。

    这是代码:

    public class CountDownTimerDaysActivity extends AppCompatActivity {
    
    /*Views declaration*/
    private TextView months_left,weeks_left,daysLeft,hrsLeft,minLeft,secLeft,endDate;
    /*Handler Declaration*/
    private Handler handler;
    /*set End Time for timer */
    private String endDateTime="2019-03-21 10:15:00";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /*inflate layout for activity*/
        setContentView(R.layout.activity_count_down_timer);
        /*invoke initView method  for views*/
        initView();
    }
    /*initView method for findviews by id*/
    private void initView() {
        months_left = findViewById(R.id.months_left);
        weeks_left = findViewById(R.id.weeks_left);
        daysLeft = findViewById(R.id.days_left);
        hrsLeft = findViewById(R.id.hrs_left);
        minLeft = findViewById(R.id.min_left);
        secLeft = findViewById(R.id.sec_left);
        endDate = findViewById(R.id.end_date);
        endDate.setText(endDateTime);
        /*invoke countDownStart() method for start count down*/
        countDownStart();
    }
    
    /*countDownStart() method for start count down*/
    public void countDownStart() {
        handler = new Handler();
        Runnable runnable = new Runnable() {
            @SuppressLint("SetTextI18n")
            @Override
            public void run() {
                handler.postDelayed(this, 1000);
                try {
                    @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    // Please set date in  YYYY-MM-DD hh:mm:ss format
                    /*parse endDateTime in future date*/
                    Date futureDate = dateFormat.parse(endDateTime);
                    Date currentDate = new Date();
                    /*if current date is not comes after future date*/
                    if (!currentDate.after(futureDate)) {
                        long diff = futureDate.getTime()
                                - currentDate.getTime();
    
                        long days = diff / (24 * 60 * 60 * 1000);
                        diff -= days *(24  *60 * 60  *1000);
                        long hours = diff / (60 * 60*  1000);
                        diff -= hours * (60*  60 * 1000);
                        long minutes = diff / (60 * 1000);
                        diff -= minutes * (60  *1000);
                        long seconds = diff / 1000;
                        @SuppressLint("DefaultLocale") String dayLeft = "" + String.format("%02d", days);
                        @SuppressLint("DefaultLocale") String hrLeft = "" + String.format("%02d", hours);
                        @SuppressLint("DefaultLocale") String minsLeft = "" + String.format("%02d", minutes);
                        @SuppressLint("DefaultLocale") String secondLeft = "" + String.format("%02d", seconds);
                        daysLeft.setText(dayLeft + "D: ");
                        hrsLeft.setText(hrLeft + "H: ");
                        minLeft.setText(minsLeft + "M: ");
                        secLeft.setText(secondLeft + "S");
    
                    } else {
                        textViewGone();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        handler.postDelayed(runnable, 1000);
    }
    private void textViewGone() {
        months_left.setVisibility(View.GONE);
        weeks_left.setVisibility(View.GONE);
        daysLeft.setVisibility(View.GONE);
        hrsLeft.setVisibility(View.GONE);
        minLeft.setVisibility(View.GONE);
        secLeft.setVisibility(View.GONE);
    }
    }
    

    希望对你有用

    【讨论】:

      【解决方案7】:

      看看这个帖子,我想它会对你有所帮助:How to check day in android?

      使用 java.util.Calendar 类,我认为您应该能够弄清楚如何完成其​​余的工作。

      http://developer.android.com/reference/java/util/Date.html -- 您可以使用 getDate()、getHours()、getMinutes()、getSeconds() 等...希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-14
        • 2012-07-08
        • 1970-01-01
        • 2020-07-02
        • 2018-08-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多