javascript同步服务器时间和同步倒计时小技巧


Posted in Javascript onSeptember 24, 2015

之前在网上看到有人提问,如何在页面上同步显示服务器的时间,其实实现方法有几种,可能 一般人立马就想到可以使用Ajax每隔一秒去请求服务器,然后将服务器获取到时间显示在页面上,这样虽然能够实现,但存在一个很大的问题,那就是每隔一秒 去请求服务器,这样如果用户多了,服务器就会崩溃(内存占用率会很大),所以在我看来,这种方法不可行,我这里给出一种解决方案,能够实现同步服务器时间、同步倒计时,却不占用服务器太多资源,下面我给写实现的思路:

第一步,当用户第一次浏览页面时,服务器首先获取当前时间并显示在页面上(比如:显示在ID为timebox span中)

第二步,设置一个每隔一秒就计算新的时间(新时间以服务器时间为初始值,然后每隔一秒累加一秒并生成新的时间)

第三步,显示第二步计算的时间

javascript同步服务器时间和同步倒计时小技巧

是不是很简单,总结成一句话就是:以服务器时间为初始值,然后在页面上自动每隔一秒就累加一秒生成新时间,这样就能保证与服务器时间同步了,误差基本在几秒内,应该没关系了,好了看一下实现的代码吧:

<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秒再重新生成时间格式,当然也可以按照上面时间同步的例子,直接进行时间减少,方法很多,我这个不一定是最优的,欢迎大家交流,谢谢!

Javascript 相关文章推荐
jQuery实现动画效果的简单实例
Jan 27 Javascript
javascript设计模式之工厂模式示例讲解
Mar 04 Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
jquery动态创建div与input的实例代码
Oct 12 Javascript
Angular.Js中ng-include指令的使用与实现
May 07 Javascript
微信小程序之蓝牙的链接
Sep 26 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
原生js实现瀑布流效果
Mar 09 Javascript
js中不同的height, top的区别对比
Sep 24 #Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 #Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 #Javascript
JS+CSS实现简易的滑动门效果代码
Sep 24 #Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 #Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 #Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
Sep 23 #Javascript
You might like
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
json数据的列循环示例
2013/09/06 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
python更新列表的方法
2015/07/28 Python
python分割列表(list)的方法示例
2017/05/07 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
Python上下文管理器全实例详解
2019/11/12 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
Python是什么 Python的用处
2020/05/26 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
vue路由实现登录拦截
2021/03/24 Vue.js
电大自我鉴定范文
2013/10/01 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
中学生演讲稿
2014/04/26 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
钓鱼岛事件感想
2015/08/11 职场文书