JS 一天执行一次的方法

方法一:

一天执行一次,很常用的场景,思路就是利用一个标识,今天没有这个标识就执行操作,然后添加标识,后续判断标识存在就不再执行相应的操作。具体实现是添加一个cookie,第一次没有这个cookie,就执行操作,同时添加一个到第二天凌晨过期的cookie。

代码如下:

function DoOne(key,method) {
	var v = getCookie(key);
	if (!v) {
		method("do something");
		//获取第二天凌晨到当前时间的秒数
		var tim_sec = 24 * 60 * 60 - (new Date().getHours() * 60 * 60 + new Date().getMinutes() * 60 + new Date().getSeconds());
		setCookie(key, "1", tim_sec);
	}
}
function dosome(msg){
	console.log(msg);
}
//写cookies 
function setCookie(name, value, second) {
	if (!second) {
		second = 7 * 24 * 60 * 60;//默认7天
	}
	var exp = new Date();
	exp.setTime(exp.getTime() + second * 1000);
	document.cookie = name + "=" + encodeURI(value) + ";expires=" + exp.toGMTString() + ";path=/";
}
//读取cookies 
function getCookie(name) {
	if (document.cookie.length > 0) {
		c_start = document.cookie.indexOf(name + "=");//获取字符串的起点
		if (c_start != -1) {
			c_start = c_start + name.length + 1;//获取值的起点
			c_end = document.cookie.indexOf(";", c_start);//获取结尾处
			if (c_end == -1) c_end = document.cookie.length;//如果是最后一个,结尾就是cookie字符串的结尾
			return decodeURI(document.cookie.substring(c_start, c_end));//截取字符串返回
		}
	}
	return "";
}

调用:

DoOne("key", dosome);

结果,每天第一次打开这个页面时都会输出
在这里插入图片描述

方法二:

 /**
  * 定时页面刷新程序bai
  * 实现du在每天指定时间刷新网页
  * 请注意:由于本程序使用cookie设置zhi了一个小时之内只允许刷新一次的限定,调试的时候试验一次后
  *   请删除cookie后再试第二次,否则一个小时之内将不再重复刷新
 **/
 var pT = 10; //时间精确点,以该数字表示的秒数进行巡检,时间越小,越精确,最小不要小于1,最大不要大于30
 var h = 9; //小时数,(24小时制)
 var m = 0; //分钟数,加上这个为了方便你调试,使用时可设置为0
 setInterval(function(){
     var d = new Date();
     if(Number(d.getHours()) == h && Number(d.getMinutes()) == m && getCookie("reloadTime") != "hasReload"){
         location.reload(true);
         setCookie("reloadTime", "hasReload", 1);
     }
 }, 1000 * pT)
 function getCookie(cookieName){
     var strCookie=document.cookie;  
     var arrCookie=strCookie.split("; "); 
     for(var i=0;i<arrCookie.length;i++){
         var arr=arrCookie[i].split("=");  
         if(cookieName==arr[0]) return unescape(arr[1]);
     }
     return false;
 }
 function setCookie(cookieName, cValue, cExpires, cPath, cDomain, secure){//cExpires为过期的小时数
     if(cExpires){
         var date=new Date();
         cExpires = date.setTime(date.getTime()+Number(cExpires)*3600*1000);
         cExpires = date.toGMTString();
     }
     document.cookie = cookieName + "=" + escape(cValue) +
         ((cExpires) ? "; expires=" + cExpires : "") +
         ((cPath) ? "; path=" + cPath : "; path=/") + 
         ((cDomain) ? "; domain=" + cDomain : "") + 
         ((secure) ? "; secure" : "");
 }

注意:程序中使用cookie来限定每天在设置的时间中内刷新一次,而不重复刷新,所以你调试的时候第一次可能好用,到了第二次(当然是在一个小时内的第二次)调试就不会有反应,这是为了防止你的“精确时间”设置的小,在这一分钟的时间里不断地重复刷新而设置的!

<think>好的,用户的问题是在JavaScript中设置每50天运行一次的Cron表达式。首先,我需要回忆一下Cron表达式的基本结构。Cron通常用于调度任务,标准的格式有五个字段,分别是分钟、小时、日期、月份、星期。用户需要每50天执行一次,所以关键点在于日期的部分。 不过,标准的Cron表达式并不直接支持像“每50天”这样的间隔,因为它通常处理的是固定的日期或间隔。例如,每天执行是“0 0 * * *”,而每月的第1天是“0 0 1 * *”。所以,每50天可能需要另一种方法。 这时候,我想到可能需要结合日期和月份来处理。比如,每50天可以转换为大约1个月20天,但这样的周期可能不固定,因为月份的天数不同。例如,1月有31天,2月可能28天,这样的话,直接设置日期间隔可能会有偏差。 另一种方法是使用更复杂的表达式,通过计算从某一天开始后的50天。比如,设置一个起始日期,然后每次任务执行后计算下一个50天的日期。这种方法可能需要动态生成Cron表达式,或者在任务执行时调整下一次执行时间。例如,使用setTimeout或者setInterval函数,每次执行后重新计算50天后的时间,并设置新的定时器。 不过,用户特别提到要使用Cron表达式,所以可能他们希望用现有的库,比如node-cron或者类似的工具。这时候需要检查这些库是否支持非标准的间隔。例如,有些库可能允许使用“*/50”在日期字段,但这样其实是每50天执行一次,但实际效果可能有问题,因为日期字段的范围是1-31,超过31的话,Cron可能无法正确解析。 因此,正确的做法可能是分步骤处理。首先,确定起始日期,比如1月1日,然后在日期字段设置为1,51。但这样可能超过某些月份的天数,导致任务不会触发。例如,51天后的日期可能已经进入下下个月,而那个月的日期可能不是51,导致任务不执行。 这时候,可能需要结合月份和日期来设置多个表达式。例如,每50天可以分解为每个月的大致天数,但这种方法可能会变得复杂,尤其是不同月份天数不同,闰年也需要考虑。 或者,可以考虑使用一个辅助的每日任务,然后在任务内部维护一个计数器,每50次执行一次实际操作。但这种方法虽然可行,但不够高效,尤其是如果有很多这样的任务,会浪费资源。 经过这些思考,我意识到可能用户需要的是一个变通的方法,而不是严格的Cron表达式。所以,最终的解决方案可能是在代码中使用setInterval,并设置50天的毫秒数,例如50 * 24 * 60 * 60 * 1000。不过,JavaScript的定时器可能有精度问题,长时间运行可能会有偏差,但这是常见的处理方式。 因此,回答用户时,需要说明标准Cron不支持每50天的间隔,建议使用动态调度,比如在任务执行后重新设置下一个执行时间。同时,给出具体的代码示例,使用setTimeout递归调用,或者使用第三方库如node-schedule来动态计算下一次执行时间。</think>在JavaScript中设置每50天执行一次的定时任务,Cron表达式无法直接实现这种非标准间隔[^1]。常规的Cron表达式最小单位为天,且无法表达超过31天的日期值。以下是两种替代方案: **方案一:动态计算下次执行时间** ```javascript function scheduleTask() { // 任务逻辑 console.log("执行50天周期任务"); // 递归调用 setTimeout(scheduleTask, 50 * 24 * 60 * 60 * 1000); } // 首次执行 setTimeout(scheduleTask, 50 * 24 * 60 * 60 * 1000); ``` **方案二:使用第三方库(如node-schedule)** ```javascript const schedule = require('node-schedule'); let lastRun = new Date(); function setNextJob() { lastRun.setDate(lastRun.getDate() + 50); schedule.scheduleJob(lastRun, () => { console.log("执行50天周期任务"); setNextJob(); // 递归设置下一次任务 }); } setNextJob(); // 初始化任务 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值