2017-09-28 10 views
0

가정하면 다음브라우저에서 Javascript를 사용하여 시작 시간과 진행률을 알면 장기 실행 작업의 남은 시간을 어떻게 계산할 수 있습니까?

  • 많은 기록
  • 작업의 진행 선형이 처리하는 장기 실행 서버 측 작업이 있습니다 - 각 레코드가 처리하는 시간의 동일한 금액을 소요 의미를 .
  • 우리는 단지 서버에서 발견하는 AJAX 요청을 사용하고 있습니다 :
    1. 레코드의 총 수를 처리 할
    2. UTC의 시작 시간
    3. 이미 처리 된 레코드 수
우리가 자바 스크립트를 사용하여 클라이언트 측에서이 프로세스의 남은 시간을 계산할 수있는 방법

?

답변

0

StackExchange에서이 문제에 대한 해결책을 찾을 수 없을 때, 나는 내 자신을 만들었습니다. 그것은 UTC 날짜에 동의해야하므로

function calculateSecondsRemaining(startUtc, completedTasks, totalTasks) { 
    var timezoneOffsetMs = new Date().getTimezoneOffset() * 1000 * 60; 

    var startDate = new Date(Date.parse(startUtc) - timezoneOffsetMs); 

    var currentDate = new Date(); 

    var elapsed = currentDate - startDate; 

    var timePer = elapsed/completedTasks; 

    var tasksRemaining = totalTasks - completedTasks; 

    var millisecondsRemaining = tasksRemaining * timePer; 

    return millisecondsRemaining/1000; 
} 

이 기능은 브라우저의 시간대 오프셋을 뺍니다. 당신과 같이 호출 할 수 있습니다 : 당신은 사람이 읽을 수있는 출력을 원하는 경우

7158.334723592197 

, 당신은 뭔가를 얻을 수 the one in this StackExchange answer 같은 기능이 결합 할 수 있습니다 :

calculateSecondsRemaining('2017-09-28T17:53:16', 2717, 8000); 

그것은 당신에게 같은 출력을 줄 것이다 같은

secondsToString() 함수의 코드 기준은 아래 제공된다
secondsToString(calculateSecondsRemaining('2017-09-28T17:53:16', 2717, 8000)); 
"0 years 0 days 1 hours 59 minutes 18.334723592197406 seconds" 

:

,
function secondsToString(seconds) { 
    var numyears = Math.floor(seconds/31536000); 
    var numdays = Math.floor((seconds % 31536000)/86400); 
    var numhours = Math.floor(((seconds % 31536000) % 86400)/3600); 
    var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600)/60); 
    var numseconds = (((seconds % 31536000) % 86400) % 3600) % 60; 
    return numyears + " years " + numdays + " days " + numhours + " hours " + numminutes + " minutes " + numseconds + " seconds"; 
}