Android 倒计时(时间戳转换天、小时、分钟、秒)

最近在做类似于商品购买的时间倒计时,在此记录一下,话不多少,请看效果图:

 倒计时 = 从后台获取到当前时间的时间戳  - 商品的截止时间
(备注:如果当前时间的时间戳获取手机本地的会出问题,因为调整本地时间后就造成的时间错误,所以线上环境每次取从后台获取到当前时间的时间戳)
此处涉及到时间戳和日期年月日时分秒的转换

//将时间戳转化为对应的时间  日-时-分-秒
    public static String timeConversion(long time) {
        long day = 0;
        long hour = 0;
        long minutes = 0;
        long sencond = 0;
        long dayTimp = time % (3600*24);
        long hourTimp = time % 3600;

        if(time >= 86400){
            day = time / (3600*24);
            if(dayTimp != 0){
                time = time-(day * 24 * 60 * 60);
                if(time  >= 3600 && time < 86400){
                    hour = time / 3600;
                    if (hourTimp != 0) {
                        if (hourTimp  >= 60) {
                            minutes = hourTimp / 60;
                            if (hourTimp % 60 != 0) {
                                sencond = hourTimp % 60;
                            }
                        } else if (hourTimp < 60){
                            sencond = hourTimp;
                        }
                    }
                } else if(time < 3600){
                    minutes = time / 60;
                    if (time % 60 != 0) {
                        sencond = time % 60;
                    }
                }
            }
        } else if (time  >= 3600 && time < 86400) {
            hour = time / 3600;
            if (hourTimp != 0) {
                if (hourTimp  >= 60) {
                    minutes = hourTimp / 60;
                    if (hourTimp % 60 != 0) {
                        sencond = hourTimp % 60;
                    }
                } else if (hourTimp < 60){
                    sencond = hourTimp;
                }
            }
        } else if(time < 3600){
            minutes = time / 60;
            if (time % 60 != 0) {
                sencond = time % 60;
            }
        }
        return (day<10?("0"+day):day) + "天" + (hour<10?("0"+hour):hour) + "时" + (minutes<10?("0"+minutes):minutes) + "分" + (sencond<10?("0"+sencond):sencond)+ "秒";
    }
 //将时间字符串转为时间戳字符串
    public static Long getStringTimestamp(String time) {
        Long longTime = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            longTime = sdf.parse(time).getTime() / 1000;

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

通过handler 发消息,每隔1秒钟发送一次,时间递减

@SuppressLint("HandlerLeak")
        private Handler handler = new Handler() {
            @Override
            public void handleMessage (Message msg) {
                super.handleMessage(msg);
                long sysTime = System.currentTimeMillis();
                String sysTimeStr = (String) DateFormat.format("yyyy-MM-dd HH:mm:ss", sysTime);
                tv_time.setText("当前时间-----"+sysTimeStr);

                Long currentStamp = getStringTimestamp(sysTimeStr);
                Long currentLast = endStamp - currentStamp;
                if(currentLast <= 0){
                    handler.removeMessages(0);
                    tv_last_time.setText("购买时间截止");
                    return;
                }
                String lastTime = timeConversion(currentLast);
                SpannableStringBuilder ss = new SpannableStringBuilder();
                ss.append("购买截止时间:"+lastTime);
                ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(MainActivity.this,R.color.color_gold)), 7, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(MainActivity.this,R.color.color_gold)), 10, 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(MainActivity.this,R.color.color_gold)), 13, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                ss.setSpan(new ForegroundColorSpan(ContextCompat.getColor(MainActivity.this,R.color.color_gold)), 16, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv_last_time.setText(ss);

                handler.sendEmptyMessageDelayed(0, 1000);
            }
        };

最后在页面销毁时移除掉handler

@Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
    }

    @Override
    protected void onPause() {
        super.onPause();
        handler.removeMessages(0);
    }


希望本篇文章对于有需要的同学给与帮助,欢迎讨论!附上代码demo

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值