求助:纽约时区下周日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
相关产品推荐
相关产品推荐

