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 相关文章推荐
地址栏上的一段语句,改变页面的风格。(教程)
Apr 02 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 Javascript
利用javascript打开模态对话框(示例代码)
Jan 11 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
JavaScript改变CSS样式的方法汇总
May 07 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
Apr 25 Javascript
巧用数组制作图片切换js代码
Nov 29 Javascript
详解vue.js组件化开发实践
Dec 14 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
微信小程序图片横向左右滑动案例
May 19 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 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 isset()与empty()的使用区别详解
2010/08/29 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
javascript计时器详解
2015/02/28 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
纯js实现隔行变色效果
2017/11/29 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
什么是python的必选参数
2020/06/21 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
Python的信号库Blinker用法详解
2020/12/31 Python
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
业务代表的岗位职责
2013/11/16 职场文书
房地产促销活动方案
2014/03/01 职场文书
小学生家长寄语
2014/04/02 职场文书
保护环境建议书100字
2014/05/13 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
中学校园广播稿
2015/08/18 职场文书