JavaScript实现服务器时间同步与倒计时方案

作者:代码拾荒时间:2026-10-29 14:59:03浏览:119

本文介绍一种高效的JavaScript方案,用于在客户端同步服务器时间并实现精确倒计时。通过获取服务器初始时间并在本地累加,避免高频请求服务器,从而降低服务器负载。同时提供同步倒计时的实现思路与代码示例,确保多终端显示一致。

服务器时间同步方案

此前有讨论如何在网页上同步显示服务器时间,常见做法是使用Ajax每秒请求服务器并更新显示。虽然可行,但高频请求会导致服务器资源消耗过大,甚至引发崩溃。因此,本文提供一种更优的解决方案,既能同步服务器时间,又能实现同步倒计时,且对服务器资源占用极低。

首先,当用户首次访问页面时,服务器获取当前时间并展示在指定元素中(例如ID为timebox的span标签内)。

接着,设置一个定时器,每秒基于服务器时间计算新时间。具体做法是以服务器时间为初始值,每秒累加一秒,生成新的时间数据。

最后,将第二步计算出的新时间显示在页面上。

服务器时间同步方案

核心思路可概括为:以服务器时间为基准,在客户端每隔一秒自动累加生成新时间,从而实现与服务器时间的同步,误差控制在几秒内,通常可接受。


<span id="timebox">11:21:55</span> //第一次将服务器时间显示在这里

<script type="text/javascript">

  $(function () {

    var oTime = $("#timebox");

    var ts = oTime.text().split(":", 3);

    var tnums = [parseInt(ts[0]), parseInt(ts[1]), parseInt(ts[2])];

    setInterval(function () {

      tnums = getNextTimeNumber(tnums[0], tnums[1], tnums[2]);

      showNewTime(tnums[0], tnums[1], tnums[2]);

    }, 1000);

    function showNewTime(h, m, s) {

      var timeStr = ("0" + h.toString()).substr(-2) + ":"

              + ("0" + m.toString()).substr(-2) + ":"

              + ("0" + s.toString()).substr(-2);

      oTime.text(timeStr);

    }

    function getNextTimeNumber(h, m, s) {

      if (++s == 60) {

        s = 0;

      }

      if (s == 0) {

        if (++m == 60) {

          m = 0;

        }

      }

      if (m == 0) {

        if (++h == 24) {

          h = 0;

        }

      }

      return [h, m, s];

    }

  });

</script>

同步倒计时实现

代码实现较为简单,此处不再赘述(若需显示日期,可在小时h为0时从服务器获取完整时间进行一次校对)。基于此思路,可进一步实现同步倒计时。同步倒计时指类似秒杀场景,设定结束时间,计算当前时间与结束时间的间隔,并确保不同电脑和浏览器上显示的倒计时一致。


<!DOCTYPE html>

<html>

<head>

  <title>同步倒计时</title>

  <script type="text/javascript" src="jquery-1.4.4.min.js"></script>

</head>

<body>

  <span id="timebox">1天00时00分12秒</span> <!--假设:1天00时00分12秒是从服务器获取的倒计时数据-->

  <script type="text/javascript">

    $(function () {

      var tid = setInterval(function () {

        var oTimebox = $("#timebox");

        var syTime = oTimebox.text();

        var totalSec = getTotalSecond(syTime) - 1;

        if (totalSec >= 0) {

          oTimebox.text(getNewSyTime(totalSec));

        } else {

          clearInterval(tid);

        }

      }, 1000);

      //根据剩余时间字符串计算出总秒数

      function getTotalSecond(timestr) {

        var reg = /\d+/g;

        var timenums = new Array();

        while ((r = reg.exec(timestr)) != null) {

          timenums.push(parseInt(r));

        }

        var second = 0, i = 0;

        if (timenums.length == 4) {

          second += timenums[0] * 24 * 3600;

          i = 1;

        }

        second += timenums[i] * 3600 + timenums[++i] * 60 + timenums[++i];

        return second;

      }

      //根据剩余秒数生成时间格式

      function getNewSyTime(sec) {

        var s = sec % 60;

        sec = (sec - s) / 60; //min

        var m = sec % 60;

        sec = (sec - m) / 60; //hour

        var h = sec % 24;

        var d = (sec - h) / 24;//day

        var syTimeStr = "";

        if (d > 0) {

          syTimeStr += d.toString() + "天";

        }

        syTimeStr += ("0" + h.toString()).substr(-2) + "时"

              + ("0" + m.toString()).substr(-2) + "分"

              + ("0" + s.toString()).substr(-2) + "秒";

        return syTimeStr;

      }

    });

  </script>

</body>

</html>

为保证倒计时精度,先将倒计时间隔统一转换为秒,然后每秒减1并重新生成时间格式。当然,也可参照时间同步的方法直接递减时间,具体方法多样,欢迎交流。

作者最新文章