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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:05:35