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