JS跨时区统一倒计时:new Date()时区标识与DST问题
跨时区统一倒计时的实现问题
我要实现一个跨时区统一的倒计时功能:在后台控制面板输入日期和时间后,前端展示的倒计时目标时间必须全球一致,不同时区用户看到的倒计时时长完全相同。目前纠结于new Date()是否需要加Z标识、是否要使用偏移量,以及夏令时(DST)相关问题,测试了几种情况,其中一种看似可行但原理存疑。
测试情况
- 不加Z:英国地区倒计时正确,但帕果帕果地区会指向当地晚10点,不符合跨时区统一需求;
- 加Z:英国和帕果帕果地区的倒计时都差1小时,不正确;
- 不加Z替换为+01:00:英国和帕果帕果地区倒计时均正确,但担心夏令时变更后会出问题。
代码示例
function countdown() { var countdown = document.getElementById( 'countdown' ); var countdownDate = new Date( '2023-06-22T22:00Z' ).getTime(); // 后台可输出格式:<?php echo $date; ?>T<?php echo $time; ?>Z,后台有时区设置(如Europe/London、UTC、+/-0:00等) // 不加Z的情况 // 英国地区倒计时正确 // 帕果帕果地区倒计时指向当地晚10点——我需要全球倒计时目标时间一致 // 加Z的情况 // 英国地区倒计时差1小时,不正确 // 帕果帕果地区倒计时差1小时,不正确 // 不加Z替换为+01:00的情况 // 英国地区倒计时正确 // 帕果帕果地区倒计时正确(和英国地区一致) // 但我不确定+01:00为什么可行——我猜是因为我当前处于+01:00时区,且在后台输入日期时也是+01:00时区,但这似乎会在未来夏令时变更时出问题 // 注:我通过Chrome DevTools > 传感器 > 位置来模拟帕果帕果地区进行测试 var x = setInterval( function() { var now = new Date().getTime(); var distance = countdownDate - now; if ( distance < 0 ) { clearInterval( x ); countdown.remove(); } else { var days = Math.floor( distance / ( 1000 * 60 * 60 * 24 ) ); var hours = Math.floor( ( distance % ( 1000 * 60 * 60 * 24 ) ) / ( 1000 * 60 * 60 ) ); var minutes = Math.floor( ( distance % ( 1000 * 60 * 60 ) ) / ( 1000 * 60 ) ); var seconds = Math.floor( ( distance % ( 1000 * 60 ) ) / 1000 ); var text = ''; text += days + '天 '; text += hours + '小时 '; text += minutes + '分钟 '; text += seconds + '秒 '; countdown.innerHTML = text; } }, 1000 ); } countdown();
<div id="countdown"></div>
核心疑问
- 如何让倒计时脚本在任意时区都指向同一目标时间?
- 是否需要在
new Date()中加入后台输入时的时区偏移量?
内容的提问来源于stack exchange,提问作者bigdaveygeorge
相关产品推荐
相关产品推荐

