假设以下内容:
- 有一个长期运行的服务器端任务,该任务处理许多记录
- 任务的进度是线性的 - 这意味着每个记录需要相同的时间来处理。
- 我们刚刚使用了AJAX请求来从服务器中查找:
- UTC中的开始时间
- 要处理的记录总数
- 已经处理过的记录数
我们如何使用JavaScript在客户端上计算此过程的剩余时间?
当我无法在stackexchange上找到解决方案时,我创建了自己的一个。
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;
}
此功能减去浏览器的时区偏移,因为它需要接受UTC日期。您可以这样称呼它:
calculateSecondsRemaining('2017-09-28T17:53:16', 2717, 8000);
它将为您提供类似的输出:
7158.334723592197
如果您想要人类可读的输出,则可以将其与此stackexchange中的功能结合起来,以获取类似的内容:
secondsToString(calculateSecondsRemaining('2017-09-28T17:53:16', 2717, 8000));
"0 years 0 days 1 hours 59 minutes 18.334723592197406 seconds"
下面提供了secondsToString()
功能的代码以供参考:
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";
}