You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中每分钟比较两个日期变量并触发指定函数?(代码未执行目标函数问题排查)

问题分析与修复方案

嘿,我一眼就瞅到问题出在哪了!你定义的current变量是脚本刚启动时的固定时间,之后再也没更新过——每次执行myFunction的时候,你都是拿脚本初始化那一刻的时间和endtime对比,这肯定永远触发不了doing()啊!

修复后的完整代码

var endtime = new Date(Date.now() + 2 * 60 * 1000);
hours = ('0' + endtime.getHours()).slice(-2);
mins = ('0' + endtime.getMinutes()).slice(-2);
secs = ('0' + endtime.getSeconds()).slice(-2);
var gametime = hours + ":" + mins + ":" + secs;
$('#endtime').html(gametime);

var i = setInterval(function () {
    myFunction();
}, 60000);

function myFunction() {
    // 关键修改:实时获取当前时间,而非使用初始化时的固定值
    if (Date.now() >= endtime.getTime()) {
        doing();
    }
}

function doing() {
    var body = $('#alert');
    var colors = ['white', 'transparent'];
    var currentIndex = 0;
    
    setInterval(function () {
        light();
    }, 400);
    
    // 优化循环逻辑,避免出现数组越界的情况
    function light() {
        body.css({ backgroundColor: colors[currentIndex] });
        currentIndex = (currentIndex + 1) % colors.length;
    }
    
    alert("Time's up!");
    clearInterval(i);
}

核心修改点说明

  • 实时获取当前时间:删掉原代码里固定的current变量,在myFunction里用Date.now()直接获取最新时间戳,和endtime.getTime()对比,保证每次检查都是当前真实时间。
  • 优化颜色循环逻辑:原代码里的currentIndex递增后会超出数组长度,改成取模运算(currentIndex + 1) % colors.length,能让索引在数组范围内循环,避免出现undefined的颜色值。
  • 简化对比逻辑:直接用时间戳对比比反复创建Date对象更高效,代码也更简洁。

另外提个小建议:如果想让触发更及时,可以把定时器间隔改小一点(比如1000毫秒,每秒检查一次),这样就不会因为每分钟检查一次而最多延迟一分钟执行。

内容的提问来源于stack exchange,提问作者Mohamed Yousef Khairlden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:02:50