如何在指定工作时间与工作日内实现计数器递增及每月重置

如何在指定工作时间与工作日内实现计数器递增及每月重置

本文详细介绍了如何使用JavaScript构建一个智能计数器,该计数器能根据预设的工作日(周一至周五)和工作时间(如上午6点至晚上8点)进行每分钟递增。它能够自动计算并累加历史工作日的分钟数,并在非工作时间或周末暂停递增但仍显示当前值。此外,计数器在每月1号自动重置,从当月开始重新计数,确保了按月统计的准确性。文章提供了完整的代码示例和关键逻辑解析,帮助开发者理解并实现此类时间敏感型计数功能。

构建基于工作时间与工作日的智能计数器

在许多应用场景中,我们需要一个计数器不仅能持续递增,还能根据特定的时间规则(如工作日、工作时间)进行智能的暂停与恢复,并在每月初自动重置。本文将详细讲解如何使用JavaScript实现这样一个功能完善的计数器,包括其核心逻辑、代码实现以及需要注意的细节。

核心功能需求分析

一个理想的智能计数器应满足以下条件:

按分钟递增: 每分钟计数器值增加1。工作时间限制: 仅在指定的工作时间内(例如上午6点至晚上8点)进行递增。工作日限制: 仅在指定的工作日内(例如周一至周五)进行递增。暂停与显示: 在非工作时间或周末,计数器暂停递增,但仍显示当前的累计值。值继承: 暂停后,下次进入工作时间时,从上次的累计值继续递增。每月重置: 每月1号,计数器自动重置,从0开始重新计数。

实现思路与关键逻辑

为了实现上述功能,我们需要精确地获取当前时间信息,并根据预设规则进行判断和计算。

1. 获取当前时间信息

首先,获取当前的日期和时间是所有判断的基础。Date 对象提供了丰富的方法来获取年、月、日、小时、分钟和星期几。

var currentDate = new Date();var currentDay = currentDate.getDay(); // 0: 星期日, 1: 星期一, ..., 6: 星期六var currentHour = currentDate.getHours();var currentMinutes = currentDate.getMinutes();var currentDayOfMonth = currentDate.getDate(); // 当前月份的日期 (1-31)

2. 定义工作时间与日期规则

将工作时间范围和周末定义为变量,增强代码的灵活性和可配置性。

var weekEndDays = [0, 6]; // 星期日和星期六var startHour = 6; // 工作开始时间 (6 AM)var endHour = 20; // 工作结束时间 (8 PM)

3. 判断当前是否在工作时段

根据定义的规则,判断当前时间是否为周末或是否在工作时间之外。

var isWeekend = weekEndDays.indexOf(currentDay) > -1;var isOutsideWorkingHours = currentHour = endHour;

4. 计算历史工作日累积值

计数器需要从月初开始累积。这意味着我们需要计算从本月1号到当前日期前一天,总共有多少个工作日,并将这些工作日的分钟数累加起来。

var daysSinceStart = 0;// 遍历从本月1号到当前日期前一天for (let i = 1; i = endHour) {    daysSinceStart++;}

这里的 daysSinceStart 变量将存储从本月1号到当前时刻(如果已过工作时间则包含今天)为止,完整工作日的数量。

5. 计算当前工作日已过分钟数

如果当前是工作日且在工作时间内,我们需要计算从工作开始时间到当前时间已经过去了多少分钟。

var minutesSinceStartOfDay = 0;if (!isWeekend && !isOutsideWorkingHours) {    // (当前小时 - 工作开始小时) * 60 + 当前分钟    minutesSinceStartOfDay = (currentHour - startHour) * 60 + currentMinutes;}

6. 初始化计数器

计数器的初始值是历史工作日累积的分钟数,加上当前工作日已经过去的分钟数。每个工作日的总分钟数是 (endHour – startHour) * 60。

var counter = daysSinceStart * (endHour - startHour) * 60 + minutesSinceStartOfDay;

7. 实时递增与暂停机制

使用 setInterval 每分钟更新计数器。关键在于,在 setInterval 的回调函数内部,必须再次检查当前是否在工作时段。这样才能实现动态的暂停和恢复。

var intervalId = setInterval(function() {    // 每次递增前重新获取时间并判断,以应对跨小时或跨天的情况    var now = new Date();    var currentDayNow = now.getDay();    var currentHourNow = now.getHours();    var isWeekendNow = weekEndDays.indexOf(currentDayNow) > -1;    var isOutsideWorkingHoursNow = currentHourNow = endHour;    if (isWeekendNow || isOutsideWorkingHoursNow) {        // 即使暂停,也需要持续输出当前计数,满足“显示值”的需求        console.log('Counter paused. Current value:', counter);        return; // 暂停递增    }    counter++;    console.log('Counter:', counter);}, 60000); // 60000 毫秒 = 1 分钟

在页面刷新时,为了立即显示当前计数器的值,可以在 setInterval 启动前输出一次。

console.log('Initial Counter Value:', counter);

8. 月末自动重置

由于 daysSinceStart 的计算总是从当前月份的1号开始,所以当月份变化时,计数器会自然地从新月份的1号重新开始计算,从而实现了每月自动重置的功能。

完整代码示例

将上述逻辑整合,形成一个完整的JavaScript函数。

function startWorkingHoursCounter() {    // 获取当前日期和时间    var currentDate = new Date();    var currentDay = currentDate.getDay(); // 0: 星期日, 1: 星期一, ..., 6: 星期六    var currentHour = currentDate.getHours();    var currentMinutes = currentDate.getMinutes();    var currentDayOfMonth = currentDate.getDate(); // 当前月份的日期 (1-31)    // 定义工作日和工作时间参数    var weekEndDays = [0, 6]; // 周末:星期日和星期六    var startHour = 6; // 工作开始时间 (上午6点)    var endHour = 20; // 工作结束时间 (晚上8点)    var workingMinutesPerDay = (endHour - startHour) * 60; // 每天工作分钟数    // 判断当前是否为周末或非工作时间    var isWeekend = weekEndDays.indexOf(currentDay) > -1;    var isOutsideWorkingHours = currentHour = endHour;    // 计算从本月1号到当前日期前一天的总工作分钟数    var daysSinceStart = 0;    for (let i = 1; i = endHour) {        daysSinceStart++;    }    // 计算当前工作日已过的分钟数    var minutesSinceStartOfDay = 0;    if (!isWeekend && !isOutsideWorkingHours) {        minutesSinceStartOfDay = (currentHour - startHour) * 60 + currentMinutes;    }    // 初始化计数器:历史工作日总分钟数 + 当前工作日已过分钟数    var counter = daysSinceStart * workingMinutesPerDay + minutesSinceStartOfDay;    // 页面加载或刷新时显示初始计数器值    console.log('Initial Counter Value:', counter);    // 每分钟递增计数器    var intervalId = setInterval(function() {        // 每次递增前重新获取当前时间,确保动态判断的准确性        var now = new Date();        var currentDayInInterval = now.getDay();        var currentHourInInterval = now.getHours();        var isWeekendInInterval = weekEndDays.indexOf(currentDayInInterval) > -1;        var isOutsideWorkingHoursInInterval = currentHourInInterval = endHour;        if (isWeekendInInterval || isOutsideWorkingHoursInInterval) {            // 在非工作时间或周末,暂停递增,但仍显示当前值            console.log('Counter paused. Current value:', counter);            return; // 停止本次递增        }        // 在工作时间,递增计数器        counter++;        console.log('Counter:', counter);    }, 60000); // 60000 毫秒 = 1 分钟}// 启动计数器startWorkingHoursCounter();

注意事项与优化建议

setInterval 的精度问题: setInterval 并非绝对精确,它只能保证在指定时间间隔后将回调函数放入事件队列。如果事件队列繁忙,实际执行时间可能会有延迟,导致长期运行下计数器与真实时间存在微小偏差。对于大多数非严格精度要求的场景,这种方式是可接受的。如果需要极高精度,可能需要考虑更复杂的同步机制或服务器端计时。计数器持久化: 当前方案在页面刷新后,计数器会根据当前时间重新计算。如果需要计数器值在页面刷新后依然保持,可以考虑使用 localStorage 或 sessionStorage 来存储 counter 的值,并在初始化时读取。配置灵活性: 将 startHour、endHour 和 weekEndDays 定义为变量,使得修改工作规则变得非常简单。可以进一步将其封装为配置对象,甚至从外部文件或用户界面加载。用户界面集成: 示例代码仅通过 console.log 输出计数器值。在实际应用中,您需要将 counter 的值更新到网页的某个HTML元素上,例如:document.getElementById(‘myCounterDisplay’).innerText = counter;。

总结

通过上述详细的逻辑分析和代码实现,我们成功构建了一个能够根据工作时间、工作日进行智能递增,并在每月初自动重置的JavaScript计数器。这个解决方案考虑了多种时间状态和边界条件,提供了高度的灵活性和可读性,适用于需要精确时间管理和统计的各类Web应用。

以上就是如何在指定工作时间与工作日内实现计数器递增及每月重置的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/103143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月21日 12:31:12
下一篇 2025年11月21日 13:15:30

相关推荐

  • 以太坊生态应用:DApp世界的无限可能

    以太坊作为区块链技术的开创者之一,其生态系统正在以前所未有的速度扩张,而其中最引人注目的莫过于dapp(去中心化应用)的蓬勃发展。dapp不仅是区块链技术应用落地的核心体现,更是预示着一个由智能合约驱动、用户拥有数据主权的全新互联网时代的到来。它们摆脱了传统中心化平台的束缚,通过代码强制执行协议,确…

    好文分享 2025年12月9日
    000
  • 比特币安全存储

    在数字货币的世界里,选择一个安全可靠的交易所至关重要。这不仅关乎到你的资产安全,也直接影响到交易体验和盈利效率。然而,面对市场上琳琅满目的交易所,如何做出明智的选择成为了许多投资者面临的难题。本篇文章将深入探讨当前主流数字货币交易所的特点,并提供详细的比特币安全存储方案,确保你的数字资产万无一失。我…

    好文分享 2025年12月9日
    000
  • 为什么虚拟币账户余额和链上显示不一致?如何排查原因

    很多刚进入币圈的新手在查看资产时,经常会发现一个问题:账户或交易所中的虚拟币余额,与区块链浏览器上的链上数据对不上。这是否意味着资产丢失?是否存在安全风险?其实,这种现象并不罕见,背后有多种技术原因可供解释。 在深入了解前,建议新手用户先选用稳定可靠的平台进行虚拟币资产管理,例如: 币安(Binan…

    2025年12月8日
    000
  • 虚拟货币平台开发教程 手把手教你开发区块链数字货币系统(含智能合约编写)

    本文将引导您了解和实践一个基础的区块链数字货币系统的开发全过程。我们将从开发环境的搭建开始,逐步深入到核心的智能合约编写与部署,最后完成一个可以进行交互的前端界面。通过本文的讲解,您将掌握搭建一个基础虚拟货币平台所涉及的关键技术和操作流程,为进一步学习和探索打下坚实基础。 2025主流加密货币交易所…

    2025年12月8日
    000
  • PI网络,PI2DAY和开拓者:深入研究分散融资的未来

    探索pi网络的最新进展,包括pi2day庆典、kyc sync功能以及对开拓者和更广泛加密生态的影响。 PI网络、PI2DAY与开拓者:透视去中心化金融的未来 2025年6月28日举行的年度PI2DAY庆祝活动为整个生态系统带来了关于进度更新和可能上架交易所的热烈讨论。本次活动聚焦于KYC Sync…

    2025年12月8日
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • JavaScript动态生成日历式水平日期布局的优化实践

    本教程将指导如何使用javascript高效、正确地动态生成html表格中的日历式水平日期布局。重点解决直接操作`innerhtml`时遇到的标签闭合问题,通过数组构建html字符串来避免浏览器解析错误,并利用事件委托机制优化动态生成元素的事件处理,确保生成结构清晰、功能完善的日期展示。 在前端开发…

    2025年12月6日 web前端
    000
  • Linux文件系统rsync命令详解

    rsync通过增量同步高效复制文件,支持本地及远程同步,常用选项包括-a、-v、-z和–delete,结合SSH可安全传输数据,配合cron可实现定时备份。 rsync 是 Linux 系统中一个非常强大且常用的文件同步工具,能够高效地在本地或远程系统之间复制和同步文件与目录。它以“增量…

    2025年12月6日 运维
    000
  • VSCode入门:基础配置与插件推荐

    刚用VSCode,别急着装一堆东西。先把基础设好,再按需求加插件,效率高还不卡。核心就三步:界面顺手、主题舒服、功能够用。 设置中文和常用界面 打开软件,左边活动栏有五个图标,点最下面那个“扩展”。搜索“Chinese”,装上官方出的“Chinese (Simplified) Language Pa…

    2025年12月6日 开发工具
    000
  • VSCode的悬浮提示信息可以自定义吗?

    可以通过JSDoc、docstring和扩展插件自定义VSCode悬浮提示内容,如1. 添加JSDoc或Python docstring增强信息;2. 调整hover延迟与粘性等显示行为;3. 使用支持自定义提示的扩展或开发hover provider实现深度定制,但无法直接修改HTML结构或手动编…

    2025年12月6日 开发工具
    000
  • 优化PDF中下载链接的URL显示:利用HTML title 属性

    在pdf文档中,当包含下载链接时,完整的url路径通常会在鼠标悬停时或直接显示在链接文本中,这可能不符合预期。本文将探讨为何传统方法如`.htaccess`重写或javascript不适用于pdf环境,并提出一种利用html “ 标签的 `title` 属性来定制链接悬停显示文本的解决方…

    2025年12月6日 后端开发
    000
  • Phaser 3 游戏画布响应式适配:保持高度控制宽度

    本文旨在提供一种在 Phaser 3 游戏中实现画布响应式适配的方案,核心思路是利用 `Phaser.Scale.HEIGHT_CONTROLS_WIDTH` 缩放模式,使画布高度适应父容器,宽度随之调整,并始终居中显示。这种方法适用于需要保持游戏核心内容在屏幕中央,允许左右裁剪的场景。 在 Pha…

    2025年12月6日 web前端
    000
  • Phaser 3游戏画布响应式布局:实现高度适配与宽度裁剪

    本文深入探讨phaser 3游戏画布在特定响应式场景下的布局策略,尤其是在需要画布高度适配父容器并允许左右内容裁剪时。通过结合phaser的scalemanager中的`height_controls_width`模式与精细的css布局,本教程将展示如何实现一个既能保持游戏画面比例,又能完美融入不同…

    2025年12月6日 web前端
    000
  • 分布式系统下的JavaScript消息队列实现

    答案:在Node.js中通过集成RabbitMQ或Kafka实现分布式系统消息通信。使用amqplib连接RabbitMQ,创建通道并声明交换机与队列,通过publish发送、consume接收消息,保障可靠性与解耦;或采用kafkajs连接Kafka集群,生产者向topic发消息,消费者订阅处理,…

    2025年12月6日 web前端
    000
  • 解决HTML锚点链接页面重载与URL路径丢失问题

    在使用html锚点链接进行页面内部导航时,开发者可能会遇到页面意外重载或url路径丢失的问题,导致无法正确滚动到目标区域。本文将深入探讨这一常见问题的根源,并提供一种简洁有效的解决方案:确保锚点链接的`href`属性包含当前页面的完整相对路径,从而实现平滑的页面内跳转,避免不必要的页面刷新和url结…

    2025年12月6日 后端开发
    000
  • PDF文档中隐藏下载链接真实路径的教程

    本教程旨在解决pdf文档中下载链接显示完整url路径的问题,尤其是在鼠标悬停时暴露动态参数。文章将解释为何传统的.htaccess重写或javascript方法不适用于pdf环境,并提出一种利用html “标签的`title`属性来控制链接提示文本的有效策略,从而在不影响功能的前提下,优…

    2025年12月6日 后端开发
    000
  • JavaScript SVG动态矢量图形处理

    JavaScript结合SVG可实现高效动态图形处理,通过createElementNS创建带命名空间的SVG元素,动态生成如圆形等图形;利用setAttribute实时修改属性实现交互响应;借助requestAnimationFrame或事件驱动完成平滑动画;基于数据映射生成路径,支持折线图等复杂…

    2025年12月6日 web前端
    000
  • paperok查重系统官网主页网址 paperok查重官网链接快速访问

    PaperOK查重系统官网为https://www.paperok.com,提供登录注册、免费积分领取、文档上传检测、报告查看下载等功能,整合多类学术资源库,覆盖期刊论文与网络信息,采用语义分析与分段检测技术,支持学科分类更新与引用标注建议,提升查重精准度。 ☞☞☞AI 智能聊天, 问答助手, AI…

    2025年12月6日 科技
    000
  • JavaFX跨舞台UI更新:掌握数据绑定实现弹窗数据回传主界面

    本文探讨了在javafx应用中,如何实现从子舞台(弹窗)向父舞台(主界面)回传数据并更新父舞台gui元素。通过分析传统方法的局限性,文章重点介绍了利用javafx的`stringproperty`进行数据绑定的高效解决方案,确保了父子控制器间的实时通信与界面同步,避免了创建冗余控制器实例的问题。 引…

    2025年12月6日 java
    000
  • OpenCart 3.0 联系我们邮件发送失败的诊断与解决指南

    本教程旨在解决opencart 3.0版本中“联系我们”表单邮件无法发送的问题。我们将从前端表单提交动作出发,系统性地追踪后端控制器逻辑,指导您定位邮件发送失败的根本原因。内容涵盖控制器定位、代码执行验证、数据流分析及常见配置检查,帮助您高效调试并恢复邮件功能。 OpenCart 3.0作为一款流行…

    2025年12月6日
    000

发表回复

登录后才能评论
关注微信