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 Ajax之load()方法
Oct 12 Javascript
你必须知道的JavaScript 变量命名规则详解
May 07 Javascript
纯javascript制作日历控件
Jul 17 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
ReactNative短信验证码倒计时控件的实现代码
Jul 20 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
微信小程序利用for循环解决内容变更问题
Mar 05 Javascript
JS实现密码框效果
Sep 10 Javascript
微信小程序实现加入购物车滑动轨迹
Nov 18 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环境――Appserv
2006/12/13 PHP
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
python实现简单学生信息管理系统
2020/04/09 Python
python实现处理mysql结果输出方式
2020/04/09 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
商场消防管理制度
2014/01/12 职场文书
高中生家长寄语大全
2014/04/03 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
合同范本之电脑出租
2019/08/13 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python