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

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;//返回年月日数组
        };
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下步骤来计算两个日期之间排除法定节假日周六的工作天数: 1. 首先,创建一个包含所有法定节假日的列表。你可以根据你所在的国家或地区来确定这些日期。 2. 然后,创建一个方法来判断给定的日期是否为法定节假日。在该方法中,你可以将给定的日期与法定节假日列表进行比较,如果日期匹配任何一个法定节假日,则返回true,否则返回false。 3. 接下来,创建一个方法来判断给定的日期是否为周末(即星期六或星期)。你可以使用Java中的Calendar类来获取给定日期的星期几,并判断是否为周末。 4. 然后,创建一个方法来计算两个日期之间的工作天数。在该方法中,你可以使用一个循环来遍历两个日期之间的每一天。对于每一天,你需要判断它是否为法定节假日或周末,如果不是,则将工作天数加1。 5. 最后,调用这个方法,并传入要计算的两个日期,即可得到排除法定节假日和周末的工作天数。 以下是一个简单示例代码: ```java import java.util.Calendar; public class WorkingDaysCalculator { // 创建法定节假日列表 private static final String[] HOLIDAYS = { "2022-01-01", "2022-01-02", // 示例日期,请根据实际情况修改 // ... 添加其他法定节假日 }; // 判断给定日期是否为法定节假日 private static boolean isHoliday(String date) { for (String holiday : HOLIDAYS) { if (holiday.equals(date)) { return true; } } return false; } // 判断给定日期是否为周末 private static boolean isWeekend(String date) { Calendar calendar = Calendar.getInstance(); calendar.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(5, 7)) - 1, Integer.parseInt(date.substring(8))); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY; } // 计算两个日期之间的工作天数(排除法定节假日和周末) public static int calculateWorkingDays(String startDate, String endDate) { int workingDays = 0; Calendar start = Calendar.getInstance(); start.set(Integer.parseInt(startDate.substring(0, 4)), Integer.parseInt(startDate.substring(5, 7)) - 1, Integer.parseInt(startDate.substring(8))); Calendar end = Calendar.getInstance(); end.set(Integer.parseInt(endDate.substring(0, 4)), Integer.parseInt(endDate.substring(5, 7)) - 1, Integer.parseInt(endDate.substring(8))); // 循环遍历两个日期之间的每一天 while (!start.after(end)) { String currentDate = String.format("%04d-%02d-%02d", start.get(Calendar.YEAR), start.get(Calendar.MONTH) + 1, start.get(Calendar.DAY_OF_MONTH)); // 判断当前日期是否为法定节假日或周末 if (!isHoliday(currentDate) && !isWeekend(currentDate)) { workingDays++; } // 将日期增加一天 start.add(Calendar.DAY_OF_MONTH, 1); } return workingDays; } public static void main(String[] args) { String startDate = "2022-01-01"; // 开始日期,请根据实际情况修改 String endDate = "2022-01-07"; // 结束日期,请根据实际情况修改 int workingDays = calculateWorkingDays(startDate, endDate); System.out.println("工作天数:" + workingDays); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值