当前位置: 首页 > article >正文

JS——动态判断节假日(支持自定义节假日与调休规则)

1. 为什么需要动态判断节假日在日常开发中我们经常会遇到需要判断某一天是否是节假日的场景。比如电商平台的促销活动页面需要显示节假日不发货的提示或者企业考勤系统需要自动计算员工的休假天数。传统的做法是硬编码节假日日期但这种方式存在几个明显的问题首先节假日每年都在变化。比如2024年的清明节是4月4日但2025年可能就是4月5日了。如果每次都手动更新节假日数组不仅麻烦还容易出错。其次调休规则也经常调整比如某个周末本来应该休息但因为调休变成了工作日。最后不同地区、不同公司的节假日安排可能都不一样我们需要一个灵活的解决方案。我在开发一个企业OA系统时就遇到过这个问题。最初我也是硬编码节假日结果每年都要手动更新有一次漏掉了调休日导致系统错误地给全员放了假差点造成生产事故。从那以后我就开始研究如何动态判断节假日。2. 基础实现方案2.1 核心判断逻辑我们先来看一个最基础的实现方案这也是很多项目的起点。核心思路很简单维护两个数组一个存储节假日日期一个存储调休工作日本应是周末但需要上班的日期。// 节假日数组 const holidays [ 2024-4-4, // 清明 2024-5-1, // 劳动节 // 其他节假日... ]; // 调休工作日数组 const workdays [ 2024-4-7, // 清明调休 2024-4-28, // 五一调休 // 其他调休日... ]; function isHoliday(date) { const formattedDate formatDate(date); const isWeekend date.getDay() 0 || date.getDay() 6; return ( (holidays.includes(formattedDate) || isWeekend) !workdays.includes(formattedDate) ); } function formatDate(date) { return ${date.getFullYear()}-${date.getMonth() 1}-${date.getDate()}; }这个方案有几个需要注意的细节日期格式要保持一致比如都用2024-4-4而不是2024-04-04getMonth()返回的月份是从0开始的所以要1getDay()返回星期几0是周日6是周六2.2 实际应用示例假设我们要开发一个电商平台的发货提示功能function showDeliveryNotice() { const today new Date(); const deliveryDate new Date(today); deliveryDate.setDate(today.getDate() 3); // 预计3天后发货 if (isHoliday(deliveryDate)) { console.log(节假日不发货预计发货时间顺延); } else { console.log(预计3个工作日内发货); } }我在实际项目中发现很多开发者会忽略时区问题。比如new Date()创建的是本地时间如果用户在国外访问可能会导致判断错误。稳妥的做法是明确指定时区或者使用UTC时间。3. 动态配置方案3.1 支持自定义节假日硬编码节假日的方案显然不够灵活我们需要支持动态配置。一个常见的做法是将节假日数据存储在数据库中或者通过API获取。这里我推荐使用JSON格式来配置// holidays-config.json { year: 2024, holidays: [ { name: 清明节, dates: [2024-4-4, 2024-4-5, 2024-4-6] }, { name: 劳动节, dates: [2024-5-1, 2024-5-2, 2024-5-3, 2024-5-4, 2024-5-5] } // 其他节假日... ], workdays: [ 2024-4-7, 2024-4-28 // 其他调休日... ] }然后在代码中动态加载这个配置async function loadHolidayConfig(year) { try { const response await fetch(/config/holidays-${year}.json); return await response.json(); } catch (error) { console.error(加载节假日配置失败, error); return getDefaultConfig(year); } }3.2 自动计算节假日日期更进一步我们可以实现自动计算节假日的功能。中国的传统节日如春节、清明节等都是按照农历计算的我们可以使用现成的库如lunar-calendarimport { solarToLunar, lunarToSolar } from lunar-calendar; function getSpringFestivalDates(year) { // 春节是农历正月初一 const lunarDate { year, month: 1, day: 1, isLeap: false }; const solarDate lunarToSolar(lunarDate); // 春节假期通常是从除夕到初六 const dates []; for (let i -1; i 6; i) { const date new Date(solarDate.year, solarDate.month - 1, solarDate.day i); dates.push(formatDate(date)); } return dates; }不过要注意法定节假日安排每年都会由国务院发布自动计算的结果可能需要人工校正。我在一个政府项目中就遇到过这个问题最后还是结合了自动计算和手动配置的方案。4. 高级功能实现4.1 支持多地区配置不同地区的节假日可能不一样比如少数民族地区有自己的传统节日。我们可以扩展配置方案// holidays-config.json { regions: { national: { holidays: [...], workdays: [...] }, xinjiang: { holidays: [...], workdays: [...] } } } function isHoliday(date, region national) { const config getRegionConfig(region); // 其余逻辑相同 }4.2 节假日缓存策略频繁访问节假日配置可能会影响性能我们可以实现一个简单的缓存机制const holidayCache new Map(); async function getHolidayConfig(year) { if (holidayCache.has(year)) { return holidayCache.get(year); } const config await loadHolidayConfig(year); holidayCache.set(year, config); return config; }对于单页应用可以考虑使用localStorage来持久化缓存。我在一个高并发的电商系统中就采用了这种方案节假日查询的性能提升了近10倍。4.3 调休规则自动化调休规则虽然每年都在变但有一定规律可循。我们可以尝试自动化function generateWorkdays(holidays) { const workdays []; // 找出长假前后的周末 holidays.forEach(holiday { if (holiday.dates.length 3) { // 只处理3天以上的长假 const firstDate parseDate(holiday.dates[0]); const lastDate parseDate(holiday.dates[holiday.dates.length - 1]); // 检查长假前的周末 const prevWeekend getAdjacentWeekend(firstDate, before); if (prevWeekend) workdays.push(prevWeekend); // 检查长假后的周末 const nextWeekend getAdjacentWeekend(lastDate, after); if (nextWeekend) workdays.push(nextWeekend); } }); return workdays; }当然这只是一个启发式的算法最终还需要人工确认。我在实际使用中发现这个算法能覆盖大约80%的调休情况。5. 实战经验分享在实现节假日判断功能时我踩过不少坑这里分享几个关键经验日期格式化要统一一定要确保所有日期的格式一致最好封装一个formatDate函数统一处理。我曾经因为有的日期用2024-4-4有的用2024-04-04导致bug。时区问题要注意服务器和客户端可能在不同时区建议使用UTC时间或者明确指定时区。特别是在跨时区的应用中这个问题尤为关键。边界条件要测试特别要测试12月31日和1月1日这种跨年的日期以及2月28日/29日这种闰年相关的日期。配置要可回滚节假日配置一旦出错影响很大一定要有版本控制和快速回滚机制。我们现在的做法是每次更新配置都会生成一个版本号方便快速切换。性能要考虑如果频繁调用isHoliday函数可以考虑预先生成整年的节假日日历用空间换时间。最后给一个完整的实现示例这是我目前在生产环境中使用的方案class HolidayChecker { constructor() { this.cache new Map(); } async init(year) { if (!this.cache.has(year)) { const config await this.loadConfig(year); this.cache.set(year, this.processConfig(config)); } return this.cache.get(year); } async loadConfig(year) { // 从API或文件加载配置 } processConfig(config) { // 预处理配置比如展开日期范围 return { holidays: new Set(config.holidays.flatMap(h h.dates)), workdays: new Set(config.workdays) }; } isHoliday(date, region national) { const year date.getFullYear(); const config this.cache.get(year)?.[region]; if (!config) throw new Error(未加载${year}年${region}地区的节假日配置); const formattedDate formatDate(date); const isWeekend date.getDay() 0 || date.getDay() 6; return ( (config.holidays.has(formattedDate) || isWeekend) !config.workdays.has(formattedDate) ); } } // 使用示例 const checker new HolidayChecker(); await checker.init(2024); const today new Date(); console.log(checker.isHoliday(today) ? 今天是节假日 : 今天不是节假日);这个方案经过了多个项目的验证支持动态加载配置、多地区设置和缓存优化可以直接用在生产环境中。当然根据具体需求可能还需要做一些调整比如增加节日类型判断、支持半天假等特殊场景。

相关文章:

JS——动态判断节假日(支持自定义节假日与调休规则)

1. 为什么需要动态判断节假日? 在日常开发中,我们经常会遇到需要判断某一天是否是节假日的场景。比如电商平台的促销活动页面需要显示"节假日不发货"的提示,或者企业考勤系统需要自动计算员工的休假天数。传统的做法是硬编码节假日…...

DIY蝶形激光器驱动:从零开始搭建窄脉冲种子源控制系统(附详细参数配置)

DIY蝶形激光器驱动:从零开始搭建窄脉冲种子源控制系统 在电子爱好者和激光技术初学者的世界里,能够亲手搭建一套完整的蝶形激光器驱动系统无疑是一项极具挑战性和成就感的项目。不同于市面上现成的商业产品,DIY方案不仅能让你深入理解激光器的…...

Bilibili API评论接口终极调用指南:5个高效数据获取技巧

Bilibili API评论接口终极调用指南:5个高效数据获取技巧 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mi…...

MPL3115A2传感器驱动开发与嵌入式高度气压测量实战

1. MPL3115A2 压力/高度/温度传感器深度技术解析 MPL3115A2 是 NXP(现为恩智浦半导体)推出的一款高精度、低功耗、IC 接口的绝对压力传感器,集成温度测量与气压高度计算引擎。该器件并非简单的模拟信号采集芯片,而是一个具备完整数…...

Linux环境下Chrony高精度时间同步实战指南

1. 为什么需要高精度时间同步? 想象一下这样的场景:你管理的服务器集群在处理金融交易时,因为各节点时间偏差超过50毫秒,导致交易顺序错乱引发数据不一致;或者分布式数据库因为时钟不同步出现写入冲突。这些问题的根源…...

深入LPDDR5 Rx Offset校准:为什么你的DRAM上电后时序总是不对?

深入解析LPDDR5 Rx Offset校准:解决DRAM上电时序漂移的实战指南 当你在凌晨三点的实验室里,面对第七次冷启动失败的系统,示波器上那些不稳定的DQ信号波形是否让你感到绝望?这可能是LPDDR5的Rx Offset校准出了问题。让我们从一次真…...

图像处理避坑指南:为什么你的孔洞填充总把背景也填白了?(附Python/OpenCV代码对比)

图像处理避坑指南:为什么你的孔洞填充总把背景也填白了? 在数字图像处理中,孔洞填充是一个看似简单却暗藏玄机的操作。许多初学者在实现这一功能时,常常遇到填充结果"泛滥成灾"——不仅填满了目标孔洞,连背景…...

Android高级开发工程师(KTV领域)技术深度解析与面试指南

前言:KTV应用开发的独特挑战与价值 在移动互联网深入发展的今天,KTV娱乐体验也逐渐向线上化和智能化转型。作为Android应用高级开发工程师,投身于KTV相关产品的开发与维护,意味着需要面对一系列独特的技术挑战: 实时性与低延迟: 歌唱对音频的实时同步要求极高,任何明显…...

【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)贡

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能,现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包,包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xff0…...

uniapp地图开发实战:marker聚合与点击事件优化指南

1. 为什么需要marker聚合功能 第一次在uniapp里做地图开发时,我被客户的需求难住了——要在1平方公里范围内显示3000多个充电桩位置。当我把所有marker点渲染出来后,手机直接卡成幻灯片,用户根本没法正常操作。这就是典型的marker性能瓶颈问…...

OpenClaw Skills 开发实战笔记

什么是 Skill? 简单说,Skill 是一个文件夹,里面包含 SKILL.md(核心指令文件)和配套脚本。它的作用是给 Agent 赋予特定的"工作流程"能力,而不是零散的、每次都要重新解释的指令。Skill vs Memory…...

保姆级教程:手把手教你查看FortiGate防火墙的‘固件和通用更新’服务状态

FortiGate防火墙固件更新状态检查全攻略:从Web界面到CLI的完整指南 在网络安全运维的日常工作中,FortiGate防火墙的固件管理是保障系统安全稳定的关键环节。特别是从FortiOS 7.4版本开始,固件更新规则的变化让许多管理员在操作过程中遇到了意…...

本体论与知识图谱,从 1 亿条杂乱数据到 3400 万高质量节点:这篇论文重新定义知识图谱构建

介绍一篇关于知识图谱和本体论的工作。 作者关注的问题很明确:当人们把一个超大规模、开放编辑的知识库(例如 Wikidata)变成一个“可用的属性图(typed property graph)”时,真正困难的不是把数据导出来&am…...

如何彻底修复Windows更新故障:Reset Windows Update Tool完整使用指南

如何彻底修复Windows更新故障:Reset Windows Update Tool完整使用指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

Anthropic Harness工程入门基础教程(非常详细),收藏这一篇就够了!

用 ChatGPT 和用 Claude Code,是两种完全不同的体感。 前者就是聊天,后者是在聊天的基础上给用户干活。 像 Claude Code 这样的 Coding Agent 打开终端,需求丢进去,它开始读文件、搜索代码、执行命令、跑测试、提 PR&#xff0c…...

图图的嗨丝造相模型应用:在阿里云上打造你的专属风格图片生成服务

图图的嗨丝造相模型应用:在阿里云上打造你的专属风格图片生成服务 1. 项目概述与核心价值 想快速搭建一个能生成特定风格图片的AI服务吗?"图图的嗨丝造相-Z-Image-Turbo"是一个基于Z-Image-Turbo模型、专门针对特定服饰风格进行优化的LoRA版…...

企业级OpenClaw集中部署安全架构避坑全攻略

只需1小时全链路加固,让OpenClaw稳定上线、合规无忧 在一次大型制造业项目中,某金融客户耗时三个月完成OpenClaw功能对接,却因忽略安全配置,半天内被黑客扫光知识库、篡改AI流程,直接触发合规问责。你是否也担心“一装…...

BabelDOC企业级本地化部署实战:构建安全高效的文档翻译离线解决方案

BabelDOC企业级本地化部署实战:构建安全高效的文档翻译离线解决方案 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 在数据安全合规要求日益严格的今天,企业级文档翻译系…...

抖音热榜API实战:从签名生成到数据获取的完整Java指南

1. 抖音热榜API接入前的准备工作 第一次接触抖音热榜API时,我踩过不少坑。最头疼的就是签名生成那部分,明明照着文档做却总是报错。后来才发现是参数顺序搞错了。为了避免大家走弯路,我把完整的接入流程梳理出来。 首先需要注册开发者账号。打…...

Windows内核驱动手动映射终极指南:KDMapper实战深度解析

Windows内核驱动手动映射终极指南:KDMapper实战深度解析 【免费下载链接】kdmapper KDMapper is a simple tool that exploits iqvw64e.sys Intel driver to manually map non-signed drivers in memory 项目地址: https://gitcode.com/gh_mirrors/kd/kdmapper …...

如何用Python脚本让百度网盘下载速度提升10倍?终极免费解决方案

如何用Python脚本让百度网盘下载速度提升10倍?终极免费解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘几十KB的龟速下载而烦恼吗&#xff…...

小白也能懂!Agent如何“看见”并操作电脑?收藏这份操作指南

本文深入浅出地解析了Agent操作电脑的原理,核心在于将电脑界面转化为可观察的输入,通过点击、输入等工具执行“观察—决策—执行—再观察”的循环任务。文章拆解了Agent如何“看见”屏幕、将目标转化为具体动作、执行动作并判断结果等关键问题&#xff0…...

终极KKS-HF_Patch指南:三步骤解锁Koikatsu Sunshine完整游戏体验

终极KKS-HF_Patch指南:三步骤解锁Koikatsu Sunshine完整游戏体验 【免费下载链接】KKS-HF_Patch Automatically translate, uncensor and update Koikatsu Sunshine! 项目地址: https://gitcode.com/gh_mirrors/kk/KKS-HF_Patch 想要让你的Koikatsu Sunshine…...

信号完整性入门避坑:为什么你的PCB板总在‘振铃’?从阻抗不连续说起

信号完整性实战指南:从振铃现象到阻抗匹配的工程思维 实验室里,示波器屏幕上那道本该平滑的方波信号边缘,此刻却像被风吹皱的水面般上下起伏——这种被称为"振铃"的现象,是每位硬件工程师成长路上的必修课。当你的PCB设…...

用74LS160D和190D芯片搭建交通灯控制器:一个数电课设的完整实现与调试心得

74LS160D与190D芯片实战:从零构建交通灯控制器的深度解析 当数字电路课设遇上经典74系列芯片,一场关于时序逻辑与硬件调试的思维碰撞就此展开。交通灯控制系统作为数电课程的经典项目,看似简单的红绿灯交替背后,隐藏着计数器、译码…...

黑马商城项目—SpringCloud微服务架构实战—从零搭建到功能落地的全流程解析

1. 从零认识SpringCloud微服务架构 第一次接触SpringCloud微服务时,我完全被各种组件名词搞晕了。Nacos、OpenFeign、Gateway...这些到底是什么?直到真正用它们完成了黑马商城项目,才恍然大悟:原来微服务架构就像乐高积木&#x…...

新手也能懂!用沁恒CH579低功耗蓝牙芯片的TMOS系统点个灯(附完整代码)

从零玩转沁恒CH579:TMOS任务管理系统点亮LED全攻略 第一次拿到沁恒CH579开发板时,看着官方例程里那些TMOS相关的代码,我完全摸不着头脑——什么是TaskID?EventID又该怎么用?直到用最基础的"点灯"实验跑通了整…...

SITS2026首席架构师亲授:从代码提交率到AI协作熵值——用4类文化指标量化研发团队AI就绪度

第一章:SITS2026演讲:AI原生研发的文化变革 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026主会场,来自全球17家头部科技企业的工程负责人共同指出:AI原生研发已不再仅是工具升级,而是一场覆盖协作范式、质…...

如何用Networx精准监控单个应用的网络流量?详细操作步骤解析

如何用Networx精准监控单个应用的网络流量?详细操作步骤解析 在数字化办公环境中,网络流量管理已成为提升效率的关键环节。想象一下这样的场景:团队协作时突然出现网络卡顿,却无法快速定位是哪个应用在占用带宽;或是需…...

【AI原生研发成本优化黄金法则】:20年架构师亲授7大可落地降本策略,93%团队未用过第5招?

第一章:AI原生研发成本优化的底层逻辑与认知重构 2026奇点智能技术大会(https://ml-summit.org) AI原生研发并非传统软件工程的简单延伸,其成本结构由模型训练、推理服务、数据闭环、可观测性及持续演进五大动态耦合要素共同决定。忽视这一系统性特征&…...