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

求助:纽约时区下周日16点倒计时脚本剩余不足1天显示负数值

解决每周日纽约时间16点倒计时的负数显示问题

嘿,我来帮你搞定这个倒计时显示负数的问题!咱们先拆解下原代码里的核心问题:

  • 之前计算天数和小时的逻辑没考虑当天就是周日且还没到16点的场景,而且硬编码用21 - now.getHours()的方式很不严谨——纽约有夏令时,UTC偏移会在-5和-4之间变化,直接绑定UTC21点并不靠谱。
  • 逐段计算天、小时、分钟的方式,一旦当前时间的小时/分钟超过目标值,就会直接算出负数,这就是你看到-1小时的根源。

修复后的完整代码

咱们换个更可靠的思路:先精准算出下一个纽约时间周日16点的时间戳,再计算当前时间到这个目标点的毫秒差,最后把差值拆成天、小时、分钟、秒,彻底避免负数问题。

function plural(s, i) { 
    return i + ' ' + (i > 1 ? s + 's' : s); 
}

function getNextSundayNY16() {
    const now = new Date();
    // 把当前时间转成纽约时区的时间对象
    const nyTimeString = now.toLocaleString('en-US', { timeZone: 'America/New_York' });
    const nyNow = new Date(nyTimeString);
    
    let daysUntilSunday = 7 - nyNow.getDay();
    // 如果今天就是周日
    if (nyNow.getDay() === 0) {
        // 要是已经过了16点,就等下周日
        if (nyNow.getHours() >= 16) {
            daysUntilSunday = 7;
        } else {
            daysUntilSunday = 0; // 还没到16点,当天就是目标日
        }
    }
    
    // 构建目标时间:纽约时间周日16点,分秒毫秒清零
    const target = new Date(nyNow);
    target.setDate(nyNow.getDate() + daysUntilSunday);
    target.setHours(16, 0, 0, 0);
    
    return target;
}

function sundayDelta() {
    const target = getNextSundayNY16();
    const now = new Date();
    // 确保当前时间也用纽约时区计算,避免时区差
    const nyNow = new Date(now.toLocaleString('en-US', { timeZone: 'America/New_York' }));
    
    let diffMs = target.getTime() - nyNow.getTime();
    // 极端情况:如果差值为负(理论上不会出现,防一手),直接加一周的毫秒数
    if (diffMs < 0) {
        diffMs += 7 * 24 * 60 * 60 * 1000;
    }
    
    // 拆分差值为天、小时、分钟、秒
    const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
    diffMs %= (1000 * 60 * 60 * 24);
    const hours = Math.floor(diffMs / (1000 * 60 * 60));
    diffMs %= (1000 * 60 * 60);
    const minutes = Math.floor(diffMs / (1000 * 60));
    diffMs %= (1000 * 60);
    const seconds = Math.floor(diffMs / 1000);
    
    // 过滤掉0值的单位,让显示更干净
    return [
        days > 0 ? plural('day', days) : '',
        hours > 0 ? plural('hour', hours) : '',
        minutes > 0 ? plural('minute', minutes) : '',
        plural('second', seconds)
    ].filter(Boolean).join(' ');
}

// 绑定DOM元素
const $refresh = jQuery('#refresh');
$refresh.text('News in ' + sundayDelta());
// 每秒更新一次
setInterval(function() {
    $refresh.text('News in ' + sundayDelta());
}, 1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="refresh" class="text-success" style="position: absolute;bottom: 0;"></div>

关键修复点说明

  • 精准时区处理:全程基于纽约时区计算时间,不管服务器或用户本地时区是什么,都不会出错——自动兼容夏令时,不用手动调整UTC偏移。
  • 智能目标时间判断:会自动检测当前纽约时间是否已经过了周日16点,如果过了就自动跳到下一周的周日,否则就用当天的16点,逻辑更严谨。
  • 差值拆分法:通过时间戳的差值计算剩余时间,彻底避免了逐段计算导致的负数问题,每一步用取整+取余拆分单位,保证所有数值都是非负的。
  • 更友好的显示:自动过滤掉0值的单位(比如剩余时间不足1天时,不会显示0 days),让倒计时看起来更清爽。

内容的提问来源于stack exchange,提问作者Antonio Da Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:19:36