moment.js 默認使用服務器時間

在前端使用Date對象獲取當前時間的時候,該時間是客戶端的時間。可是該時間能夠被用戶修改,因此咱們通常狀況下並不想要這個時間。若是每一次獲取時間的時候都請求一下服務器,那麼將會對服務器形成沒必要要的壓力,咱們也不想這麼作。在網上找了一圈以後,發現了一些解決方案,就在這裏總結一下前端

1.當系統被用戶第一次打開的時候,發送請求(不必寫一個專門獲取時間的API),根據http的相應頭Date字段獲取服務器時間。此時與客戶端時間作差,並將差值記錄下來。ajax

2.爲了防止客戶端時間被用戶修改,咱們每隔2s(這個自定義吧)獲取一下客戶端時間,並將上一個時間和當前時間作差,看和2s差的大不大,正常狀況下也就是幾十毫秒的差值,咱們在這裏比方設爲 1s。若是差值大於1s,咱們就認爲客戶端時間被修改了,咱們此時獲取一下前一個時間和當前時間的差值再減去2s就是修改時候後的差值。api

3.moment.js內部獲取時間是使用的moment.now方法,咱們把這個方法自定義一下就能夠了服務器

如下是代碼實現:url

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 = +new Date;
                var InverDiff = nowTime - (lastTime + InvertialMillSeconds);
                if(Math.abs(InverDiff) > maxMillSeconds){
                    diff += InverDiff;
                }
                lastTime = nowTime;
                setTimeout(arguments.callee, InvertialMillSeconds);
            }, InvertialMillSeconds);
        })
        
    })

moment.now原本是這個樣子的code

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

咱們在引入moment.js以後,從新修改該值爲server

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

到此,大功告成!對象

本文由博客一文多發平臺 OpenWrite 發佈!get

相關文章
相關標籤/搜索