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

时间: 2024-08-04 04:15:35

javascript小技巧:同步服务器时间、同步倒计时的相关文章

使用ntpdate命令同步服务器时间出现“the NTP socket is in use, exiting”

今天将一台Centos服务器还原快照后,出现了如下问题: 然后使用ntpdate命令手动同步服务器时间,出现如下提示: [[email protected] tools]# ntpdate 220.231.55.106 4 Nov 12:02:59 ntpdate[29800]: the NTP socketis in use, exiting 解决方法: 第一步:#service ntp stop 第二步:#ntpdate ntp.neu.edu.cn 问题得到解决:

配置NTP,同步服务器时间

配置NTP,同步服务器时间          项目中的服务器越来越多起来,最近又在做几个服务器上的数据库同步,同步出错就去查看日志,于是就发现了一个一直被忽视的小小问题---几台服务器的时间不一致.          于是查阅相关资料,决定用NTP(Network Time Protocol,网络时间协议)--是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms.来实现几台

12个非常实用的JavaScript小技巧

在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: func

前端知识:12个非常实用的JavaScript小技巧

在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: func

JavaScript小技巧

1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高. 1 2 3 4 5 6 7 var myVar   = "3.14159", str     = ""+ myVar,//  to string int     = ~~myVar,  //  to integer float   = 1*myVar,

常用的javascript小技巧

字符串转换为数值 常规方法: var var1 = parseInt("2"); var var2 = parseFloat("2"); var var3 = Number("2"); var var3 = new Number("2"); 简便方法: var var1 = +("2"); 将其他类型转换为boolean类型 在JavaScript中,所有值都能隐式的转化为Boolean类型: 数据类型 转

javascript小技巧之with()方法

With()方法平时用得不多,本文用个小例子来学习一下.在这里记录.个人感觉还是很方便的. 有了 With 语句,在存取对象属性和方法时就不用重复指定参考对象,在 With 语句块中,凡是 JavaScript 不识别的属性和方法都和该语句块指定的对象有关.With 语句的语法格式如下所示:With Object {Statements}对象指明了当语句组中对象缺省时的参考对象,这里我们用较为熟悉的 Document 对象对 With 语句举例.例如 当使用与 Document 对象有关的 wr

javascript特效实现(4)——当前时间和倒计时效果

这个效果的实现关键是对Date对象和setTimeout的使用. 一共有三个例子,HTML结构如下,就不添加CSS样式了. <body> 当前时间:<p id="p1"></p> 高考倒计时:<p id="p2"></p> 限时抢购:<p id="p3"></p> </body> 主要体会javascript的实现 window.onload=func

javascript小技巧-js小技巧收集(转)

本文转载自:http://blog.csdn.net/ocean20/article/details/2498699 每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得