- 产品需求:定时器
- 当前周期之前为"已结束"
- 在当天00:00:00 - 10:00:00倒计时
- 到当天时间 10:00:00 为"抢购中", 抢光了:用户点击按钮,明天的开始计时,今天的为"已抢光"
- 周期之后为"未开始"
- 环境: vuejs
- js代码基本实现:
function leftpad(str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
function countDown (endTime, standardTime) {
var distance = endTime - standardTime
var day = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor(distance / (1000 * 60 * 60) % 24);
var minutes = Math.floor(distance / (1000 * 60) % 60);
var seconds = Math.floor(distance / 1000 % 60);
return {
day: leftpad(day, 2, 0),
hours: leftpad(hours, 2, 0),
minutes: leftpad(minutes, 2, 0),
seconds: leftpad(seconds, 2, 0)
}
}
getCountTime() {
let nowDate = new Date().getTime() ;
let serviceTimeStamp = new Date(this.timer.serviceTime).getTime()
let deviceTimeStamp = new Date(this.timer.deviceTime).getTime()
let endTimeStamp = new Date(this.timer.endTime).getTime()
let distanceTime = Math.abs(deviceTimeStamp - serviceTimeStamp);
let standardTime
if (deviceTimeStamp > serviceTimeStamp) {
standardTime = nowDate - distanceTime
} else {
standardTime = nowDate + distanceTime
}
let timer = setTimeout(() => {
let countDownTime = countDown(endTimeStamp, standardTime)
if (Number(countDownTime.hours) <= 0 && Number(countDownTime.minutes) <= 0 && Number(countDownTime.seconds) <= 0) {
clearTimeout(timer)
countDownTime = {
hours: '00',
minutes: '00',
seconds: '00'
}
this.timer.beginNow = true
} else {
this.getCountTime();
}
this.refreshTime(countDownTime);
}, 900);
},
refreshTime (timer) {
this.date.forEach((item, index) => {
if (index+1 === this.timer.countDay) {
item.hours = timer.hours
item.minutes = timer.minutes
item.seconds = timer.seconds
}
this.$set(this.date, index, item)
})
},
endTime(addDay){
let serviceNow = new Date(new Date(this.timer.serviceTime).getTime())
let dates = serviceNow.getDate() + addDay
this.timer.countDay = serviceNow.getDay()
this.timer.countDay += addDay
this.timer.endTime = serviceNow.getFullYear() + '-' + (serviceNow.getMonth()+1) + "-" + dates + ' ' + "10:00:00"
this.getCountTime()
}
this.timer.serviceTime = this.timer.serviceTime || new Date().getTime()
let serviceNow = new Date(new Date(this.timer.serviceTime).getTime())
this.weekday = serviceNow.getDay()
console.log(this.weekday)
this.timer.deviceTime= new Date()
if (this.weekday > 0 && this.weekday < 6) {
this.endTime(0)
if (serviceNow.getTime() > new Date(this.timer.endTime).getTime() && serviceNow.getMonth() === serviceNow.getMonth() && serviceNow.getDate() === serviceNow.getDate()) {
this.timer.beginNow = true
}
}
```