2016-12-01 69 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