代码之家  ›  专栏  ›  技术社区  ›  Sachin Kainth

Javascript倒计时、时区和夏令时问题

  •  1
  • Sachin Kainth  · 技术社区  · 13 年前

    我们的团队在JQuery倒计时方面遇到了大问题,我们真的需要一些帮助。

    最初,我们有一些ScriptSharp代码可以做到这一点

    JQueryCountdownOptions opts = new JQueryCountdownOptions();
    opts.Layout = "<ul class=\"group\"> <li>{dn} <span>{dl}</span></li> <li>{hn} <span>{hl}</span></li> <li>{mn} <span>{ml}</span></li> <li>{sn} <span>{sl}</span></li> </ul>";
    opts.Until = Number.ParseInt(timeLeft);
    
    jQuery.Select("#countdownclock").Plugin<JQueryCountdown>().Countdown(opts);
    jQuery.Select("#countdownclock").Show();
    jQuery.Select("#bidBox").RemoveAttr("disabled");
    

    我们注意到的是,这使用客户端的时钟从开始倒计时。因此,如果客户决定提前5小时更改时间,则倒计时将为5小时。

    为了解决这个问题,我们引入了更多的代码

    在视图中:

       $(function () {
    
            var expires = new Date(@year, @month, @day, @hours, @minutes, @seconds);
            $('#clockDiv').countdown({ until: expires, timeZone: null, serverSync: serverTime, onTick: serverTime, tickInterval: 60 });
    
            function serverTime() {
                var time = null;
                $.ajax({ url: '/Auction/SyncServerTime',
                    async: false, dataType: 'json',
                    success: function (result) {
                        time = new Date(result.serverTime);
                    }, error: function (http, message, exc) {
                        time = new Date();
                    }
                });
                return time;
            }
    });
    

    在控制器中

    public JsonResult SyncServerTime()
            {
                var result = new JsonResult
                {
                    Data = new
                    {
                        serverTime = DateTime.Now.ToString("MMM dd, yyyy HH:mm:ss zz")
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                return result;
            }
    

    该代码确保无论用户将时钟设置为什么,倒计时计时器都会定期与服务器的时间同步。问题解决了。

    唯一的问题是我们提出了其他问题。

    问题是,当用户处于不同的时区时,这些用户的倒计时会根据其时区的时区偏移量而有所不同。我们已经尝试更改各种参数,但仍然存在问题。更糟糕的是,如果我的时间跨度跨越了夏令时适用的日期,那么无论是在同一时区还是在不同时区,事情都会再次出错。我们已经尝试了不同的代码和参数,所以上面只是我所做的,与我尊敬的同事所尝试的不同。我想问的是,肯定有人要求

    1. 编写一个独立于客户端时间并基于服务器时间的倒计时。
    2. 无论用户处于哪个时区,都显示相同的剩余天数、小时数、分钟数和秒数
    3. 显示时间在此期间因夏令时而更改的用户与时间在此期间不会因夏令时更改的用户的剩余天数、小时数、分钟数和秒数
    4. 显示 真实的 用户的剩余天数、小时数、分钟数和秒数,该用户的时间在此期间将因夏令时而更改。

    当然,我们不可能是唯一有过这个问题的人。不可能这么难。有人知道解决方案吗?

    谢谢

    萨钦

    1 回复  |  直到 13 年前
        1
  •  1
  •   Nikhil Kothari    13 年前

    我个人还没有处理过同样的情况,但看到日期、时区问题等自动弹出会引发人们对一些潜在问题的思考,这些问题源于使用本地日期对象而不是UTC日期对象。

    IMO,如果所有的计算和日期序列化都只在UTC空间中工作,最后当用户显示日期时,根据场景将其转换为本地或适当的时区,情况会更好。另一方面,用户输入本地或某个时区的相对输入,并立即将其转换为UTC作为内部表示。这避免了应用程序不同层之间的各种混乱。

    这并不是你具体问题的真正解决方案,但也许需要考虑一些事情才能解决。