Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
如何在指定工作时间与工作日内实现计数器递增及每月重置_创想鸟

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

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

本文详细介绍了如何使用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/1516412.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
构建按工作日和工作时间运行的JavaScript计数器
上一篇 2025年12月20日 10:02:05
JavaScript:解决HTML元素加载前脚本执行导致Null值问题
下一篇 2025年12月20日 10:02:13

相关推荐

  • Java中实现跨类和函数共享变量的策略

    Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略

    本文深入探讨了在Java中实现跨类和函数共享变量的有效策略。通过利用public static关键字,可以在不创建对象实例的情况下,使变量在整个应用程序中具备全局可访问性。文章将通过示例代码演示其使用方法,并提供关于此模式的注意事项与最佳实践,以帮助开发者理解其优势和潜在风险。 核心概念:publi…

    2026年9月24日 • 用户投稿
    100
  • Java中实现跨类和函数共享变量的指南

    Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南Java中实现跨类和函数共享变量的指南

    本教程将详细介绍在Java中如何创建可在所有类和函数中访问的共享变量。通过利用public static关键字,我们可以定义类级别的变量,实现全局共享状态。文章将提供声明、访问示例,并讨论使用此类变量时的最佳实践和注意事项,确保代码的可维护性和健壮性。 理解共享变量的需求 在java应用程序开发中,…

    2026年9月24日 • 用户投稿
    200
  • 空洞骑士丝之歌可以联机吗 联机功能情况说明​

    空洞骑士丝之歌目前无法进行联机游戏,尽管官方尚未正式声明,但游戏中并未设置多人在线模式或服务器支持功能。同时,剧情发展、地图结构等内容均围绕主角大黄蜂独立构建,未提供其他可操作角色,因此不具备联机游玩的基础条件。 关于空洞骑士丝之歌是否支持联机的详细说明如下: 一、当前联机状态明确 截至目前,本作不…

    2026年9月23日
    000
  • PrestaShop分类描述在分页时隐藏的机制与SEO考量

    本教程探讨PrestaShop商店中分类描述在分页时消失的现象。我们将解释为何在访问第二页或后续页面时,分类描述不再显示,甚至在返回第一页后也可能消失。文章将从技术实现和搜索引擎优化(SEO)的角度分析这一行为,强调其通常并非问题,并提供专业见解。 PrestaShop分类描述分页行为解析 在pre…

    2026年9月23日
    100
  • AO3镜像站替代访问链接_AO3镜像站官方镜像站点

    AO3镜像站替代访问链接为https://nightalk.xyz,用户可通过主站或镜像站点登录账户,支持中文界面切换与多端同步阅读。 AO3镜像站替代访问链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站官方镜像站点,感兴趣的网友一起随小编来瞧瞧吧! https://arc…

    2026年9月23日
    200
  • Java Collections.synchronizedList方法如何保证线程安全

    synchronizedList通过同步方法保证线程安全,使用synchronized关键字对每个操作加锁,确保单个操作的原子性;但迭代或复合操作需手动同步,否则可能引发并发异常;其性能较低,适用于读多写少、并发不高的场景,高并发下推荐使用CopyOnWriteArrayList。 Java 中 C…

    2026年9月22日
    300
  • Java多线程并发控制:告别线程优先级,拥抱锁机制

    本文深入探讨了在Java多线程环境中如何有效解决并发操作中断问题,特别是当多个线程尝试同时执行非原子性操作(如打印)时。文章指出,单纯依赖线程优先级并不可靠,并详细介绍了使用synchronized关键字配合共享锁对象实现互斥访问的关键技术,确保关键代码块的原子性执行,从而避免数据混乱和逻辑错误。 …

    2026年9月22日
    800
  • Prestashop分页隐藏分类描述的SEO考量与处理

    本文探讨了Prestashop商店中分类描述在分页后消失的问题。我们解释了这种现象通常并非SEO问题,因为搜索引擎主要关注第一页的描述内容。教程将深入分析此行为背后的SEO逻辑,并提供确保网站SEO友好的最佳实践,强调第一页描述的重要性及规范使用Canonical标签。 Prestashop分类描述…

    2026年9月22日
    300
  • MySQL全文搜索如何与外部引擎结合_提升搜索体验?

    MySQL全文搜索如何与外部引擎结合_提升搜索体验?MySQL全文搜索如何与外部引擎结合_提升搜索体验?MySQL全文搜索如何与外部引擎结合_提升搜索体验?MySQL全文搜索如何与外部引擎结合_提升搜索体验?

    mysql 的全文搜索在中文分词和复杂查询上存在局限,常结合外部引擎提升性能。1. 使用 elasticsearch,通过 logstash 或 canal 同步数据,安装中文分词插件并利用布尔查询等优化搜索。2. 利用 sphinx,从 mysql 直接构建索引,通过 sql-like 接口和中文…

    2026年9月21日 • 用户投稿
    100
  • VSCode中怎么使用REM_VSCode移动端REM布局编写与换算教程

    答案:REM_VSCode插件可自动将像素转换为REM,需配置rootFontSize和precision,支持自动与手动转换,确保与html的font-size一致,配合media query适配不同屏幕,若插件异常可检查配置、重启或重装,替代工具有postcss-pxtorem、在线转换工具及浏…

    2026年9月21日
    300
  • 在Java中如何实现线程优先级控制

    Java中线程优先级通过Thread类实现,取值范围1-10,分别对应MIN_PRIORITY、NORM_PRIORITY和MAX_PRIORITY;新线程继承父线程优先级,可通过setPriority()设置;尽管高优先级线程更可能被调度,但执行顺序不保证,因受操作系统影响;应避免依赖优先级控制关…

    2026年9月21日
    100
  • 猎豹浏览器最新官方网址链接 猎豹浏览器平台入口直达官网首页

    猎豹浏览器最新官方网址是http://m.liebao.cn/,该网站提供安卓和iPhone版浏览器下载,具备双引擎加速、视频缓存、安全防护及个性化设置等功能。 猎豹浏览器最新官方网址链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台入口直达官网首页,感兴趣的网友一起随小编…

    2026年9月21日
    100
  • mysql如何优化like模糊查询

    优先使用前缀匹配并建立索引,避免前置通配符导致全表扫描;对大字段采用全文索引或外部搜索引擎如Elasticsearch;合理设计覆盖索引,减少SELECT *,提升查询效率。 在MySQL中,LIKE模糊查询虽然常用,但容易导致性能问题,特别是在数据量大的情况下。优化的关键在于减少全表扫描、提升索引…

    2026年9月20日
    000
  • 在Java中如何实现线程间安全通信

    答案:Java中线程安全通信需保证可见性、原子性和有序性,常用synchronized实现同步与wait/notify协作,ReentrantLock结合Condition提供更灵活控制,BlockingQueue适用于生产者-消费者模型,volatile确保变量可见性,原子类如AtomicInte…

    2026年9月12日
    000
  • Java中声明和管理类静态成员(“全局”变量)的最佳实践

    本文深入探讨了在java中通过static关键字声明类静态成员(常被称为“全局”变量或数组)的方法。文章强调了在设计时应尽量减少对全局状态的依赖,以提升代码的可维护性、可测试性和线程安全性。通过一个前缀和计算的示例,展示了如何优化代码结构,优先使用局部变量和函数返回值,从而避免共享可变状态带来的潜在…

    2026年9月12日
    300
  • 如何在Java中实现线程安全的缓存更新

    使用ConcurrentHashMap、Future+Callable、ReadWriteLock或Caffeine等方案可实现Java线程安全缓存。1. ConcurrentHashMap适用于高并发读写场景,通过分段锁或CAS保证线程安全;2. Future方案结合原子操作避免多线程重复计算,提…

    2026年9月12日
    100
  • Lark日历同步手机异常的原因

    在使用lark日历与手机同步时,用户可能会遭遇一些异常状况,影响日程管理及数据的实时同步。 网络连接不稳定 网络质量差或信号弱是造成lark日历同步失败的主要因素之一。当设备处于如地下车库、电梯间等信号覆盖较弱的区域,或Wi-Fi与移动数据频繁切换时,可能导致同步过程中断。这种情况下,通常会在手机界…

    2026年9月11日
    100
  • iPhoneAireSIM卡怎么更新运营商设置_iPhoneAireSIM运营商设置更新方法

    若iPhone Air的eSIM无法激活或连接网络,可依次尝试:①在“设置-通用-关于本机”中轻点运营商版本号检查更新;②重启设备以触发自动更新;③通过控制中心开关飞行模式刷新网络;④联系联通客服10010或前往营业厅获取专用配置,确保运营商设置为最新。 如果您在使用 iPhone Air 的 eS…

    2026年9月10日
    000
  • 腾讯元宝AI在线应用入口 腾讯元宝网页版高效入口

    腾讯元宝AI在线应用入口为https://yuanbao.tencent.com,支持文档解析、多格式上传、摘要生成、多文档对比整合及问答对生成;提供AI写作、绘画、PPT生成与代码辅助;可通过网页端或App跨平台使用,支持微信、QQ、手机号登录,实现云端数据同步。 ☞☞☞AI 智能聊天, 问答助手…

    2026年9月9日
    100
  • Swoole协程里怎么安全地使用全局变量

    使用CoroutineLocal实现协程隔离,避免全局变量数据混乱,推荐通过Context传递上下文,共享状态则用Channel或Atomic保证安全。 在 Swoole 协程环境中,多个协程共享同一个进程的内存空间,但协程是并发执行的。直接使用 PHP 的全局变量(如 $GLOBALS、stati…

    2026年9月9日
    000

发表回复

登录后才能评论
关注微信