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 入门讲解1
Apr 15 Javascript
jquery 追加tr和删除tr示例代码
Sep 12 Javascript
简介JavaScript中fixed()方法的使用
Jun 08 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
js密码强度实时检测代码
Mar 02 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
js匿名函数作为函数参数详解
Jun 01 Javascript
JS异步文件上传(兼容IE8+)
Apr 02 Javascript
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
详解js访问对象的属性和方法
Oct 25 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
node crawler如何添加promise支持
Feb 01 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php实现的漂亮分页方法
2014/04/17 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
js导出txt示例代码
2014/01/14 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python中关键字is与==的区别简述
2014/07/31 Python
Python中多线程及程序锁浅析
2015/01/21 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
女子职高个人自荐书
2014/02/01 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL