2016-12-01 53 views
-1

我一直在做一個頁面,並且我的當前需求之一是它使用服務器的時間運行,而不是由Date對象使用的客戶端本地時間運行,我的第一種方法是要求從服務器每秒的時間,但這是真的效率低下,所以我想知道,是否有任何辦法,在從服務器請求Date對象一次後,每秒鐘更新同一個Date對象以繼續它從服務器?使用Javascript的更新日期對象

+0

'setInterval'可以是你的朋友。 –

+0

確實,'setInterval()'可以讓你更新本地的Date對象,但它仍然會使用客戶端時鐘。 – Pointy

+0

你有時區問題?如果是在客戶端和服務器中都使用utc。 – Alon

回答

0

解決方法是:(這是angularjs的實現) 這個東西是一個Date對象有一個叫做getTime()的函數,它返回自1970年以來通過的毫秒數,所以你可以使用這個數並保持每秒增加1000毫秒這種方式,你不必依靠多個請求,也不在當地時間

$scope.current_TimeStamp = 0; 
$scope.clock= function(){ 

    setTimeout($scope.clock, 1000); 
    $scope.current_TimeStamp+=1000; 
    var today = new Date($scope.current_TimeStamp) 
    var days = [ 'Domingo','Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado']; 
    var months = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']; 
    var date = days[today.getDay()] +" " + today.getDate()+ " de " + months[today.getMonth()] + " "+ today.toLocaleTimeString() ; 

    if(document.getElementById('time') !== null) 
     document.getElementById('time').innerHTML = date; 
} 
$scope.startTime= function(){  
    // make the request to get the date from the server 
    // in my case I store it in $scope.current_TimeStamp 
    RoomService.RequestTime().then(function(response){ 
     var date = new Date(response.data) 
     $scope.current_TimeStamp = date.getTime() 
     var t = setTimeout($scope.clock, 1000); 
    }) 

} 
$scope.startTime(); 
+0

你依賴於setTimeout以*精確* 1秒的間隔運行,它不會這樣做。它總是有點晚,這會導致時鐘慢慢漂移。 * getTime *也不需要。要向日期添加一秒,請使用'date.setSeconds(date.getSeconds()+ 1)'。 – RobG

+0

關於setTimeout的使用情況,使用setInterval可能會更好一些,如果還有其他方式我不知道它,但這是我想到的第一種方式,所以我發佈了它,並感謝getTime的替代方案,這個答案會爲我節省大約兩個小時的浪費時間,哈哈,我想時間學習是永遠不會浪費的。 –

+0

可能最好的解決方案是Alex K:從服務器發送時間,並與客戶端有所不同。四捨五入到最接近的15分鐘(這是時區的最小增量),並且每次創建新日期時都應用該偏移量以顯示時間。要保持合理準確的時鐘滴答聲,請依次調用setTimeout,並根據當前Date的毫秒數加上下一個整秒後大約10毫秒的值來延遲下一次調用。 – RobG