【写在前面】前些日子忙了几天有关指标对比分析的功能,因为系统是对接券商类的业务,所以他们比较关注的是工作日的数据波动,因此前端指标对比数据需要拿工作日的,不然他们停市的数据比较也没用,故而今天针对之前实现的做一个对比,首先给大家看一下时间线的对比效果。

判断是否是节假日 java工具类 js判断节假日_数组


针对这个echarts的效果实现大家可以看我的之前的文章哈。

一、效果展示

这篇文章我们就针对工作日的时间计算做个总结哈,首先我们需要有一个当前对比基准值,下面我写了一个小demo给大家看看效果;

判断是否是节假日 java工具类 js判断节假日_前端_02


这个是我基于今年(2022年)的国庆节后做的一个测试,测试数据很OK,下面就带大家来看看怎么实现的吧;

二、实现过程

1、准备一个节假日数组
这个存在不定因素,因为每年的节假日都是国务院发布的,所以每年都要进行更新,暂时我做到的是2021年、2022年、2023年一月份的统计信息,大家后面可以根据自己的要求进行维护。暂时我先把这个数据贴出来大家看看哈,以便使用;
具体近三年节假日统计如下所示:

2、实现基准值前N天的计算(包括工作日、非工作日)
首先基于原有的数据进行一个遍历递推,将前N天的数据计算出来,存放到一个数组里面以便后用;

3、针对基准值的前N天数组进行非工作日的过滤
在这步的核心有两个,计算非工作日个数和修改前N天数组值为非工作日,都是采用递归函数实现的。

Part1、计算某个日期前有几个非工作日

输入一个日期,你得计算它是不是非工作日,如果是,它的前一个是否还是非工作日,做一个累加,也就是说这个日期及其前几天有几个非节假日,返回值为其前紧连非节假日个数。具体实现效果如下所示:

判断是否是节假日 java工具类 js判断节假日_数据_03


判断是否是节假日 java工具类 js判断节假日_数组_04


具体实现代码见第三部分-1.获取非工作日跨度

这个里面的holidayList就是第一步需要准备的数组变量,其目的就是为了获取跨度。

Part2:前N天转化成前N个工作日
此处主要是针对获取的非节假日个数后对原有数组的值进行调整,每次将最大的时间值抽取出来,然后只有发现最大的时间处于非节假日,则所有的其他时间段都要往前推,具体推得天数就是part1返回的Nums值。然后递归调用赋值即可;
具体代码见第三部分-2.最终转换

三、核心代码

1、获取非工作日跨度

function isIncludeHoliday(holidayList, dayStr, nums) {
        debugger;
        var newLnum = 0;
        for (var k = 0; k < holidayList.length; k++) {
            if (dayStr.indexOf(holidayList[k].dayStr) > -1) {
                dayStr = formatTime_scond(new Date(dayStr).getTime() - 24 * 60 * 60 * 1000, false);
                ++newLnum;
            }
        }
        if (newLnum > 0) {
            return isIncludeHoliday(holidayList, dayStr, ++nums);
        } else {
            return nums;
        }
    }

2、最终转换核心源码

function resetArrListNew(returnArr, arrDayList, initNum) {
        debugger;
        if (returnArr.length == initNum) {
            return returnArr;
        } else {
            for (var k = 0; k < arrDayList.length; k++) {
                debugger;
                var numRang = isIncludeHoliday(holidayArrayList, arrDayList[k], 0);
                if (numRang > 0) {
                    var newArrDay = [];
                    var _dayStrArr = "";
                    for (var l = 0; l < arrDayList.length; l++) {
                        _dayStrArr = formatTime_scond(new Date(arrDayList[k]).getTime() - (numRang + l) * 24 * 60 * 60 * 1000, false);
                        newArrDay.push(_dayStrArr);
                    }
                    var newchangeList = [];
                    for (var j = 1; j < newArrDay.length; j++) {
                        newchangeList.push(newArrDay[j]);
                    }
                    returnArr.push(newArrDay[k]);
                    arrDayList = newchangeList;
                    return resetArrListNew(returnArr, arrDayList, initNum);
                     break;
                } else {
                    var newchangeList = [];
                    for (var j = 1; j < arrDayList.length; j++) {
                        newchangeList.push(arrDayList[j]);
                    }
                    returnArr.push(arrDayList[k]);
                    arrDayList = newchangeList;
                    return resetArrListNew(returnArr, arrDayList, initNum);
                    break;
                }
            }
        }
    }

四、Demo分享及彩蛋