欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

获取两个日期之间的日期和天数(去除周六日以及节假日)遇见周六日或节假日时停止倒计时,等节假日过后继续倒计时

程序员文章站 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;//返回年月日数组
        };