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

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

这个是我基于今年(2022年)的国庆节后做的一个测试,测试数据很OK,下面就带大家来看看怎么实现的吧;
1、准备一个节假日数组
这个存在不定因素,因为每年的节假日都是国务院发布的,所以每年都要进行更新,暂时我做到的是2021年、2022年、2023年一月份的统计信息,大家后面可以根据自己的要求进行维护。暂时我先把这个数据贴出来大家看看哈,以便使用;
具体近三年节假日统计如下所示:
2、实现基准值前N天的计算(包括工作日、非工作日)
首先基于原有的数据进行一个遍历递推,将前N天的数据计算出来,存放到一个数组里面以便后用;
3、针对基准值的前N天数组进行非工作日的过滤
在这步的核心有两个,计算非工作日个数和修改前N天数组值为非工作日,都是采用递归函数实现的。
Part1、计算某个日期前有几个非工作日
输入一个日期,你得计算它是不是非工作日,如果是,它的前一个是否还是非工作日,做一个累加,也就是说这个日期及其前几天有几个非节假日,返回值为其前紧连非节假日个数。具体实现效果如下所示:


具体实现代码见第三部分-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;}}}}
分享
百度云
链接:https://pan.baidu.com/s/1dsMOVUfTaMcafFfLiyNioQ
提取码:hdd6
123云盘
https://www.123pan.com/s/ZxkUVv-xEJ4
提取码:hdd6
彩蛋
喜欢博主的文章的可以支持一下博主哟,支持博主的皆可上皇榜。
皇榜入口点击此处