【写在前面】前些日子忙了几天有关指标对比分析的功能,因为系统是对接券商类的业务,所以他们比较关注的是工作日的数据波动,因此前端指标对比数据需要拿工作日的,不然他们停市的数据比较也没用,故而今天针对之前实现的做一个对比,首先给大家看一下时间线的对比效果。
针对这个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;
}
}
}
}
四、Demo分享及彩蛋
分享
百度云
链接:https://pan.baidu.com/s/1dsMOVUfTaMcafFfLiyNioQ
提取码:hdd6
123云盘
https://www.123pan.com/s/ZxkUVv-xEJ4
提取码:hdd6
彩蛋
喜欢博主的文章的可以支持一下博主哟,支持博主的皆可上皇榜。
皇榜入口点击此处