【工作日推算】JS计算当前时间前N个工作日(去除周末及节假日,文尾附源码下载)

news2025/1/15 17:13:13

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

彩蛋

喜欢博主的文章的可以支持一下博主哟,支持博主的皆可上皇榜。
皇榜入口点击此处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何快速搞懂一家公司?

如果没有快速作为前提&#xff0c;你的搞懂&#xff0c;价值会大打折扣。 一.研究一家公司需要的宏观视野 1.把握长期明确趋势 看清宏观大背景能为你搞懂公司做出铺垫&#xff0c;同时看清这个公司和宏观的密切程度是怎样的&#xff0c;也决定了需要多大程度关注宏观变化。 …

【基于Pycharm的Django3教程】Part1:初识Django

文章目录1 初识Django1.1 django的安装1.2 创建django项目1.3 两种创建方式的对比1.4 默认文件介绍1.5 APP的创建和说明1.6 启动运行django1.7 模板和静态文件1.8 模板语法1.9 请求和响应1.10 orm数据库操作1.11 ORM 数据库案例&#xff1a;用户管理1 初识Django 1.1 django的…

22 条 API 设计的最佳实践

在这个微服务的世界里&#xff0c;后端API的一致性设计是必不可少的。 今天&#xff0c;我们将讨论一些可遵循的最佳实践。我们将保持简短和甜蜜——所以系好安全带&#xff0c;出发咯&#xff01; 首先介绍一些术语 任何API设计都遵循一种叫做“面向资源设计”的原则&#…

TOWER x Binance NFT 桥接教程

TOWER x Binance NFT 销售的 TOWER 门票和人物化身皮肤 NFT 现在可以从 BNB 链桥接到 Polygon 啦&#xff01; 一起来看看如何将你的 TOWER x Binance NFT 从 BNB 链转移到 Polygon&#x1f447; 1、到 BinanceNFT 用户中心提取你的 TOWER NFT 到 BNB Chain&#xff0c;然后等待…

html多个好看的背景动态效果(附源码)

文章目录1.设计来源1.1 图片轮动背景1.2 星空流星背景1.3 动态美女背景1.4 动态屋雨背景1.5 动态街道背景1.6 动态夜幕背景2.效果和源码2.1 动态效果2.2 透明度配置2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/arti…

在线绘制富集分析多组气泡图和单细胞分析marker基因矩阵气泡图

常规的GO或者KEGG通路富集分析结果通常以气泡图的形式展示&#xff0c;然而这个气泡图仅仅是一个比较的结果&#xff0c;如果想在一张图上展示多个比较的结果&#xff0c;就需要用到多组气泡图&#xff08;图1&#xff0c;左侧&#xff09;。 单细胞RNA-seq分析结果中&#xf…

delphi异步与javascript

delphi及C Builder异步处理与javascript 目录 delphi及C Builder异步处理与javascript 1、用于实现异步事件、异步方法、及其异步结果回调的可自定义的通用类型 2、你可引用以下基于接口化对象和异步结果的接口的抽象类&#xff0c;去实现异步方法或异步事件的自定义类 2.…

关于DDoS攻击,这些基本概念你一定要知道!

什么是DDoS攻击 DDoS是Distributed Denial of Service的简称&#xff0c;中文是分布式拒绝服务。 这有点拗口吧&#xff1f; 这样&#xff0c;我们先理解下DDoS的前身DoS&#xff08;Denial of Service&#xff09;&#xff0c;即拒绝服务。 最基本的DoS攻击就是攻击者利用…

基础--吊打面试官--精通synchronized底层实现原理

synchonized是一个字段 1.0之前太慢&#xff0c;重&#xff0c;jdk1.0后修改&#xff0c;变得轻.修改的原理是&#xff1a;以前是涉及到用户态和内核态的交互&#xff0c;现在是用户态实现。 基本概念理解&#xff1a; 用户态和内核态的概念&#xff1a;程序的不同级别。内核态…

Vue学习:事件处理(与用户产生交互-点击)

Vue对元素绑定事件&#xff0c;需要使用指令&#xff0c;也就是v-开头 v-on&#xff1a;当什么什么时候时候 点击-出现弹窗&#xff1a;使用method方法 <!-- 准备容器 --><div idroot> <h2>欢迎页面&#xff0c;你好 {{name}}</h2><!-- v-on:click…

(附源码)小程序 法律全书 毕业设计 280844

小程序spring boot法律全书管理系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;小程序法律全书被用…

计算机毕业设计ssm+vue基本微信小程序的灾情救助系统 uniapp 小程序

项目介绍 自新冠疫情爆发以来,给各行各业带来了前所未有的挑战。国务院、党中央高度重视灾情救助工作,研究出一系列重要的措施和方法。并广泛利用信息化技术手段,对灾情信息发布、救助管理等进行管理。对于受灾地区来说,存在管理难度大,手段单一,灾民流动性复杂等问题。单靠人…

git 暂存当前分支修改,切换到别的分支

收藏&#xff0c;原文链接Git学习记录-git保留/丢弃当前分支修改并切换至其他分支 - 爱写bug的程序员 - 博客园 (cnblogs.com) 笔者在本地终端进行 git 工作目录的相关处理时&#xff0c;遇到由于某种情况需要使用 git checkout 命令切换到其他分支的情景。此时&#xff0c;若…

3 - 线程池 Java内置的线程池 - ExecutorService

1、ExecutorService的介绍 ExecutorService 接口继承了Executor 接口&#xff0c;是Executor 的子接口。 Executors类 提供工厂方法用来创建不同类型的线程池。Executors是工具类&#xff0c;他提供对ThreadPoolExecutor的封装&#xff0c;会产生几种线程池供大家使用。 关于…

derby 转 mysql

背景 nacos使用standalone方式启动&#xff0c;数据存储到内置的derby数据库中&#xff0c;现在要更改为集群启动&#xff0c;原数据要转成mysql。 执行过程 1.nacos内置的derby数据打包后放到本地 tar -cvf data.tar nacos/data/derby-data 2.通过idea添加Apache Derby&a…

【区块链】Ankr被黑引发的思考

机会 三明治交易、夹子机器人、抢跑、抢新、抢购、秒杀&#xff0c;相信这些词你都听说过了&#xff0c;区块链上的各种套利操作&#xff0c;基本上都有一个大前提&#xff0c;就是监听链上最新的未打包交易&#xff0c;才能在第一时间抢占先机。 前段时间Ankr被黑&#xff0…

进阶 - Git的自定义

Git的自定义 忽略特殊文件 有些时候&#xff0c;你必须把某些文件放到Git工作目录中&#xff0c;但又不能提交它们&#xff0c;比如保存了数据库密码的配置文件啦&#xff0c;等等&#xff0c;每次git status都会显示Untracked files ...&#xff0c;有强迫症的童鞋心里肯定不…

大学生网页制作期末作业——html+css+javascript+jquery旅游官网6页 html大学生网站开发实践作业 web网页设计实例作业

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

java alibaba fastjson自定义序列化反序列化(教你解决问题思路)

大家版本不一样方式可能不一样&#xff0c;我不管你的fastjson版本是哪个&#xff0c;按照我这个思路去弄就行 写一个JSONObject类&#xff0c;导入fastjson的JSONObject&#xff0c;然后CTRL鼠标左键点进去看JSONObject源码&#xff0c;然后点击IDEA的左上角select opened fil…

掘金量化如何精准选股?

说起掘金量化如何精准选股的这个问题&#xff0c;相信大家也很期待&#xff0c;就比如说我们在量化投资中&#xff0c;一方面对股票的涨跌是需要灵活的去判断&#xff0c;才能知晓这其中有哪些是我们应该选择的股票&#xff0c;但是要自己去观察&#xff0c;也是很麻烦&#xf…