2017-09-28 5 views
0

En supposant que les suivantes:Comment puis-je calculer le temps restant d'une tâche de longue durée si je connais l'heure de début et de progresser en utilisant Javascript dans le navigateur?

  • Il y a une longue durée sur les tâches côté serveur qui traite de nombreux dossiers
  • La progression de la tâche est linéaire - ce qui signifie que chaque enregistrement prend la même quantité de temps pour traiter .
  • Nous venons d'utiliser une requête AJAX pour savoir à partir du serveur:
    1. L'heure de début UTC
    2. Le nombre total d'enregistrements à traiter
    3. Le nombre d'enregistrements qui ont déjà été traitées

Comment peut-on calculer le temps restant pour ce processus sur le côté client en utilisant javascript?

Répondre

0

Lorsque je n'ai pas été capable de trouver une solution pour cela sur StackExchange, j'ai créé l'un des miens.

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; 
} 

Cette fonction de décalage du fuseau horaire soustraient du navigateur, car il doit accepter une date UTC. Vous pouvez l'appeler comme ceci:

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

Il vous donnera une sortie comme:

7158.334723592197 

Si vous voulez une sortie lisible par l'homme, vous pouvez combiner cela avec une fonction comme the one in this StackExchange answer pour obtenir quelque chose comme:

secondsToString(calculateSecondsRemaining('2017-09-28T17:53:16', 2717, 8000)); 
"0 years 0 days 1 hours 59 minutes 18.334723592197406 seconds" 

le code de la fonction secondsToString() est fournie ci-dessous à titre de référence:

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"; 
}