【工作日推算】JS计算当前时间前N个工作日(去除周末及节假日,文尾附源码下载)
【写在前面】前些日子忙了几天有关指标对比分析的功能,因为系统是对接券商类的业务,所以他们比较关注的是工作日的数据波动,因此前端指标对比数据需要拿工作日的,不然他们停市的数据比较也没用,故而今天针对之前实现的做一个对比,首先给大家看一下时间线的对比效果。
针对这个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
彩蛋
喜欢博主的文章的可以支持一下博主哟,支持博主的皆可上皇榜。
皇榜入口点击此处
【工作日推算】JS计算当前时间前N个工作日(去除周末及节假日,文尾附源码下载)相关推荐
- php图片动画源码,JavaScript_jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载),ImageDrawer.js是一款可以实现动 - phpStudy...
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载) ImageDrawer.js是一款可以实现动态绘制图片动画的jQuery插件.通过ImageDrawer.js插件,你可 ...
- python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载
采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...
- android 原生开发 3d地图 下载_arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)...
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...
你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...
- arcgis xml 下载 切片_arcgis api 4.x for js地图加载arcgisserver本地离线瓦片(附源码下载)...
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- 全球前十大一致性最好的交易系统之一Aberration(附源码)
全球前十大一致性最好的交易系统Aberration,长线策略,主要用在日K线,周K线上. Aberration 交易系统由Keith Fitschen 于 1986 年发明,1993 年Kei ...
- arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- springboot+vue.js+mysql+基于VUE框架的商城综合项目自动化系统的实现 毕业设计-附源码051018
商城综合项目自动化系统 摘 要 目前电商系统商城项目管理极其频繁,迫切地需要自动化测试来代替人工繁琐而又重复的劳动.自动化测试相关的研究已经很多,但多数只是针对某一方面,比如单一接口或者单一页面或者性 ...
- arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
最新文章
- JavaScript setTimeout() 介绍
- pmp考试用计算机,PMP是计算机类考试吗
- 【 MATLAB 】Fourier Analysis and Filtering frame(傅立叶分析和滤波 框架)
- SD卡格式化怎么恢复?只需要五个步骤
- var类型推断关键字
- python之解析最简单的xml
- 为Visual Studio 2010增加ExtJs智能提示
- WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
- 【架构】大型网站优化技术思路
- ORACLE功能GREATEST功能说明具体实例
- Atitit 并发处理 go与 java对比较 目录 1. 并发编程的七个模型 线程,fp,actor,csp 数据级并行 Lambda	1 2. 四种并发编程模型简介 多线程,callback
- 史上最经典Java入门基础视频,没有之一!
- 数理统计: 第五章 方差分析与试验设计
- AVOD-代码理解系列(四)
- oss文件普通下载-断点下载
- 做华为外包一年的总结
- 谷歌、百度你更看好哪一个?
- 100+CAD常用机械零件图练习图限量获取
- 关于参加“兆易创新杯”第十三届中国研究生电子设计竞赛,国赛二等奖的总结(fishing_5)
- 什么是机器学习,为什么它如此重要?