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

如何修改JavaScript代码实现每日/每周日UTC4点倒计时?

实现MMORPG每日/每周UTC重置倒计时

针对你需要的每日UTC4点和每周日UTC4点重置倒计时,我们可以重构原有代码,把通用逻辑抽离成可复用的函数,同时分别计算两个重置节点的目标时间。

修改后的HTML结构

首先需要两个独立容器来展示两个倒计时:

<div id="daily-reset">每日重置倒计时:</div>
<div id="weekly-reset">每周重置倒计时:</div>

重构后的JavaScript代码

我们把倒计时核心逻辑拆分为「计算目标重置时间」「格式化倒计时字符串」「更新倒计时显示」三个部分,代码更清晰易维护:

// 格式化倒计时为 HH:MM:SS 格式
function formatCountdown(seconds) {
    const hours = Math.floor(seconds / 3600);
    const minutes = Math.floor((seconds % 3600) / 60);
    const secs = Math.floor(seconds % 60);
    // 补零处理,保证两位数格式
    return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

// 获取下一次每日UTC4点的时间
function getNextDailyReset() {
    const now = new Date();
    // 转换为UTC时间计算,避免本地时区干扰
    const utcNow = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds()));
    const resetTime = new Date(utcNow);
    resetTime.setUTCHours(4, 0, 0, 0);
    
    // 如果当前UTC时间已过4点,自动切换到次日4点
    if (utcNow > resetTime) {
        resetTime.setUTCDate(resetTime.getUTCDate() + 1);
    }
    return resetTime;
}

// 获取下一次每周日UTC4点的时间
function getNextWeeklyReset() {
    const now = new Date();
    const utcNow = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds()));
    const resetTime = new Date(utcNow);
    // UTC时间中周日的星期值为0,计算距离下一个周日的天数
    const daysUntilSunday = (7 - utcNow.getUTCDay()) % 7;
    resetTime.setUTCDate(resetTime.getUTCDate() + daysUntilSunday);
    resetTime.setUTCHours(4, 0, 0, 0);
    
    // 如果当前UTC时间已过周日4点,自动切换到下一周周日4点
    if (utcNow > resetTime) {
        resetTime.setUTCDate(resetTime.getUTCDate() + 7);
    }
    return resetTime;
}

// 更新单个倒计时容器的显示
function updateCountdown(containerId, getTargetTimeFn) {
    const container = document.getElementById(containerId);
    const targetTime = getTargetTimeFn();
    const now = new Date();
    const diffMs = targetTime.getTime() - now.getTime();
    // 处理页面长时间未刷新导致时间差为负的极端情况
    const diffSeconds = Math.max(0, Math.floor(diffMs / 1000));
    container.innerHTML = `${container.innerHTML.split(':')[0]}:${formatCountdown(diffSeconds)}`;
}

// 启动定时器,每秒更新一次两个倒计时
setInterval(() => {
    updateCountdown('daily-reset', getNextDailyReset);
    updateCountdown('weekly-reset', getNextWeeklyReset);
}, 1000);

// 页面加载时立即执行一次,避免初始空白
updateCountdown('daily-reset', getNextDailyReset);
updateCountdown('weekly-reset', getNextWeeklyReset);

代码说明

  • UTC时间处理:全程基于UTC时间计算,彻底避免本地时区差异导致的倒计时错误
  • 复用性设计:格式化、时间计算逻辑拆分为独立函数,后续修改重置时间只需调整对应函数
  • 边界场景处理:自动判断当前时间是否已过重置点,切换到下一个有效节点;同时兼容页面长时间未刷新的极端情况
  • 初始加载优化:页面加载时立即执行一次更新,避免倒计时容器初始为空

内容的提问来源于stack exchange,提问作者DoMx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:34:58