最近写了一个倒计时,应公司要求,到年底要完成的任务
用DatePickerDialog可以选择年月日,但是项目要求到春节放假,所以日期是固定的,但是将选择日期的代码附上
val calendar = Calendar.getInstance()
val year = calendar[Calendar.YEAR]
val month = calendar[Calendar.MONTH]
val day = calendar[Calendar.DAY_OF_MONTH]
val datePickerDialog = DatePickerDialog(
this,
{ view, year, month, dayOfMonth -> setBir(year, month, dayOfMonth) },
year,
month,
day
)
datePickerDialog.setMessage("倒计时")
datePickerDialog.show()
fun setBir(year: Int, month: Int, dayOfMonth: Int) {
//设置数据到实体中,自动刷新界面
tv_text.text = (year.toString() + "年" + (month + 1) + "月" + dayOfMonth + "日")
//刷新实体,驱动界面更新
// entity.notifyChange()
tv_text.text = year.toString()+"-"+(month+1)+"-"+dayOfMonth+" "+"00:00:00"
}
下面来实现倒计时:
private fun setTime() {
@SuppressLint("SimpleDateFormat") val simpleDateFormat// ★★★格式("yyyy-MM-dd HH:mm:ss")一定要写对★★★ 不然会出现时间错乱
= SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
try {
// Date nowTime = new Date(System.currentTimeMillis()); //获取当前时间的另一种
val nowTime = System.currentTimeMillis() //获取当前时间
val overTime =
simpleDateFormat.parse(failureTime) //利用SimpleDateFormat来把字符串日期转换为Date对象类型
val a = overTime.time - nowTime // 计算总的时间差(毫秒级别)
if (a > 0) { //如果大于零 说明时间有剩余
// 总时间(a)
// 总天数( day*(1000 * 60 * 60 * 24) )
// 总小时数( hour * (1000 * 60 * 60) )
// 总分钟数( minute * (1000 * 60) )
// 总时间 中有几天
val day = a / (1000 * 60 * 60 * 24)
// 总时间 去除天数后,还剩多少小时
val hour = (a - day * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
// 总时间 去除天数与小时后,还剩多少分钟
val minute =
(a - day * (1000 * 60 * 60 * 24) - hour * (1000 * 60 * 60)) / (1000 * 60)
// 总时间 去除天数小时与分钟后,还剩多少秒
val second =
(a - day * (1000 * 60 * 60 * 24) - hour * (1000 * 60 * 60) - minute * (1000 * 60)) / 1000
//刷新ui显示
textView!!.text = "剩余:" + day + "天" + hour + "时" + minute + "分" + second + "秒"
} else {
Toast.makeText(this, "小于等于零", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
主要代码,备注很详细,大家都能看懂
下面使用
private var failureTime: String? = "2021-12-05 16:19:45" // 失效时间
@SuppressLint("HandlerLeak")
private val handler: Handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
setTime()
// 在handleMessage发送handle消息实现无限刷新
sendMessageDelayed(this.obtainMessage(), 1000) // 延迟一秒发送,1秒刷新一次
}
}
这个是开启,放在需要开启的地方即可
handler.sendMessage(handler.obtainMessage()) // 在这里开始 时间计时
效果图奉上,样式不重要,