moment.js 默认使用服务器时间


在前端使用Date对象获取当前时间的时候,该时间是客户端的时间。但是该时间可以被用户修改,所以我们一般情况下并不想要这个时间。如果每一次获取时间的时候都请求一下服务器,那么将会对服务器造成不必要的压力,我们也不想这么做。在网上找了一圈之后,发现了一些解决方案,就在这里总结一下

1.当系统被用户第一次打开的时候,发送请求(没必要写一个专门获取时间的API),根据http的相应头Date字段获取服务器时间。此时与客户端时间做差,并将差值记录下来。

2.为了防止客户端时间被用户修改,我们每隔2s(这个自定义吧)获取一下客户端时间,并将上一个时间和当前时间做差,看和2s差的大不大,正常情况下也就是几十毫秒的差值,我们在这里比方设为 1s。如果差值大于1s,我们就认为客户端时间被修改了,我们此时获取一下前一个时间和当前时间的差值再减去2s就是修改时候后的差值。

3.moment.js内部获取时间是使用的moment.now方法,我们把这个方法自定义一下就可以了

以下是代码实现:

    var diff = 0;           // 记录服务器和客户端的时间差值
    var lastTime;           // 记录上一次时间
    $(function(){
        $.ajax({
            url: apiURL,
        }).always(function(res, state, xhr){
            var serverTime = new Date(xhr.getResponseHeader("Date")).getTime();
            var localTime = +new Date;
            diff = serverTime - localTime;
            lastTime = localTime;
            var InvertialMillSeconds = 2000;
            var maxMillSeconds = 1000;
            // 每InvertialSeconds毫秒检测一次当前时间,
            // 若差值大于maxMillSeconds那么可以判断出客户端时间被修改了
            setTimeout(function(){
                var nowTime = +newDate;
                var InverDiff = nowTime - (lastTime + InvertialMillSeconds);
                if(Math.abs(InverDiff) > maxMillSeconds){
                    diff += InverDiff;
                }
                lastTime = nowTime;
                setTimeout(arguments.callee, InvertialMillSeconds);
            }, InvertialMillSeconds);
        })
        
    })
    

moment.now本来是这个样子的

    var now = function() {
        return Date.now ? Date.now() : +(new Date());
    };

我们在引入moment.js之后,重新修改该值为

    if (window.moment && window.moment.now) {
        moment.now = function(){
            return Date.now ? Date.now()+top.diff : (new Date().getTime() + top.diff);
        }
    }

到此,大功告成!

本文由博客一文多发平台 OpenWrite 发布!

优质内容筛选与推荐>>
1、asp.net如何设置全局主题皮肤
2、Jquery全屏动画触摸滑动焦点图片
3、拯救我的肚子。。
4、asp.net利用RAR实现文件压缩解压缩
5、JDK9对集合添加的优化


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号