获取两个日期之间的日期和天数(去除周六日以及节假日)遇见周六日或节假日时停止倒计时,等节假日过后继续倒计时
程序员文章站
2022-05-18 08:08:50
...
js代码实现
节假日需要自己填写,如有问题可以联系本人
//获取零点时刻
function formatTime(timestamp) {
let time = new Date(timestamp)//指定日期
let stTime = timestamp - time.getHours() * 60 * 60 * 1000 - time.getMinutes() * 60 * 1000 - time.getSeconds() * 1000 - time.getMilliseconds();
console.log(stTime,'零点零分');
return stTime//返回时间戳
}
// 获取年月日
function geshishijian(nnxx) {
// 判断是否传参,如果没有就获取当前的时间
if (nnxx) {
var myDate = new Date(nnxx);
} else {
var myDate = new Date();
}
myDate.getYear(); //获取当前年份(2位)
var nian = myDate.getFullYear(); //获取完整的年份(4位,1970-????)
var yue = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
var ri = myDate.getDate(); //获取当前日(1-31)
yue = (yue < 10 ? '0' : '') + yue
ri = (ri < 10 ? '0' : '') + ri
var riqi1 = nian + "-" + yue + "-" + ri
return riqi1
}
/// 4-16 12
timeFn('2021-04-20 12:57:49')
function timeFn(d1) {
// 判断参数是否为空,如果为空就不执行
if (!d1) {
return
}
var bbb = d1.split(" ")[0]; //目标日期不带时间
var ccc = geshishijian(); //当前日期不带时间
var dateBegin = new Date(d1.replace(/-/g, "/"));//将-格式转换成/格式
var dateEnd = new Date(); //获取当前时间
var xiuxiri = ['2021-05-03', '2021-05-04', '2021-05-05', ] //休息日期
// var zhouliuri = ['2021-04-17','2021-04-18','2021-04-24','2021-04-25',]//周六日
var worArr = ['2021-04-25']; //工作日期
// 如果当前时间大于目标时间就直接返回-1并结束
if (dateEnd.getTime() > dateBegin.getTime()) {
var sj = -1
return sj
}
if (ccc != bbb) { //当前日期不等于目标日期时
var riqi = getBetweenDateStr(ccc, bbb); //两个日期间所有的日期
var dateDiff = dateBegin.getTime() - dateEnd.getTime(); //时间差的毫秒数,获取总天数
// 循环两个日期中所有的日期
for (let i = 0; i < riqi.length; i++) {
// 循环休息日期
for (let j = 0; j < xiuxiri.length; j++) {
// 如果有一样的日期就用总天数减去一天
if (riqi[i] == xiuxiri[j]) {
dateDiff -= 86400000
}
}
var wor = geshishijian(new Date(riqi[i]))//将两个日期中间的所有日期转换格式,只保留年月日
// 如果这个日期是周六或者周天并且不再工作数组里,就接着用总天数减去一天
if (new Date(riqi[i]).getDay() == 0 && worArr.indexOf(wor) == -1 || new Date(riqi[i]).getDay() ==6 && worArr.indexOf(wor) == -1) {
dateDiff -= 86400000
}
} //总天数
} else { //当前日期等于目标日期就正常执行
var dateDiff = dateBegin.getTime() - dateEnd.getTime(); //总天数的时间戳
}
var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
var xiuxi = new Date().getDay(); //0||6,获取当前星期
// 如果当前是周六或者周天,并且不再工作数组里,或者可以在节假日里找到
if (xiuxi == 0 && worArr.indexOf(wor) == -1 || xiuxi == 6 && worArr.indexOf(wor) == -1 || xiuxiri.indexOf(wor) != -1) {
var lingdian = formatTime(new Date())//获取到当前的零点零分
var end = lingdian - 0 + 24 * 60 * 60 * 1000 - 1;//通过当前的零点零分获取到当前的23点59分
var qianyitian = new Date(end - 24 * 60 * 60 * 1000);//通过当前的23点59分获取到前一天的23点59分
var dateDiff = dateBegin.getTime() - qianyitian.getTime(); //用目标时间减去前一天23点59分,获取到总天数
for (let i = 0; i < riqi.length; i++) {
// 循环休息日期
for (let j = 0; j < xiuxiri.length; j++) {
// 如果有一样的日期就减去一天
if (riqi[i] == xiuxiri[j]) {
dateDiff -= 86400000
}
}
var wor = geshishijian(new Date(riqi[i]))
if (new Date(riqi[i]).getDay() == 0 && worArr.indexOf(wor) == -1 || new Date(riqi[i]).getDay() == 6 && worArr.indexOf(wor) == -1) {
dateDiff -= 86400000
}
} //总天数
var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
var leave1 = dateDiff % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
var hours = Math.ceil(leave1 / (3600 * 1000)) //计算出小时数
console.log(hours + "小时 ");
// 当天数等于0天时显示小时,否则显示天数
if (dayDiff == 0) {
// 当小时小于0时显示-1用来进行数据渲染时的判断依据
if (hours <= 0) {
var sj = -1;
} else {
var sj = (hours + "小时 ");
}
} else {
// 当时间小于0时表示已过期,直接返回-1
if (dayDiff < 0) {
var sj = -1;
} else {
// 当剩余小时超过12时向上取整加1天,小于12小时时就显示当前天数
if (hours >= 12) {
var sj = (dayDiff + 1 + "工作日");
} else {
var sj = (dayDiff + "工作日");
}
}
}
console.log(" 相差 " + dayDiff + "天 " + hours + "小时 ");
console.log(sj);
} else {
var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
console.log(dayDiff);
var leave1 = dateDiff % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
var hours = Math.ceil(leave1 / (3600 * 1000)) //计算出小时数
console.log(" 相差 " + dayDiff + "天 " + hours + "小时 ");
if (dayDiff == 0) {
if (hours <= 0) {
var sj = -1;
} else {
var sj = (hours + "小时 ");
}
} else {
if (dayDiff < 0) {
var sj = -1;
} else {
if (hours >= 12) {
var sj = (dayDiff + 1 + "工作日");
} else {
var sj = (dayDiff + "工作日");
}
}
}
console.log(sj);
}
return sj
}
// 用来获取两个日期之间的所有日期
function getBetweenDateStr(start, end) {//start为开始时间,end为目标时间,格式为‘2021-04-14’,不带时间
var result = [];//先var一个空数组用来储存值
var beginDay = start.split("-");//以‘-’来拆分成数组
var endDay = end.split("-");//以‘-’来拆分成数组
var diffDay = new Date(); //获取当前时间
var dateList = new Array;//赋值为数组
console.log(dateList);
var i = 0;//循环条件
diffDay.setDate(beginDay[2]); //设置某一天
// console.log(diffDay,"日");
diffDay.setMonth(beginDay[1] - 1); //设置为某一个月
diffDay.setFullYear(beginDay[0]); //设置为某一年
result.push(start);//往新建的数组里添加开始日期
// 循环获取日期
while (i == 0) {//循环条件
var countDay = diffDay.getTime() + 24 * 60 * 60 * 1000; //从当前日期推迟24小时
diffDay.setTime(countDay);//获取到24小时候的一天
// console.log(diffDay);
// 往新建的数组里添加24小时后的年月日
dateList[2] = diffDay.getDate();
dateList[1] = diffDay.getMonth() + 1;
dateList[0] = diffDay.getFullYear();
// 补零
if (String(dateList[1]).length == 1) {
dateList[1] = "0" + dateList[1]
};
if (String(dateList[2]).length == 1) {
dateList[2] = "0" + dateList[2]
};
// 往存放开始时间的数组里添加推迟24小时后的年月日
result.push(dateList[0] + "-" + dateList[1] + "-" + dateList[2]);
// 结束循环条件,当目标年月日 = 当前年月日时将i赋值为1,结束循环
if (dateList[0] == endDay[0] && dateList[1] == endDay[1] && dateList[2] == endDay[2]) {
i = 1;
}
};
console.log(result);
console.log(result.length);
return result;//返回年月日数组
};