如果我知道使用JavaScript在浏览器中使用JavaScript进行进步,我该如何计算长期运行任务的剩余时间



假设以下内容:

  • 有一个长期运行的服务器端任务,该任务处理许多记录
  • 任务的进度是线性的 - 这意味着每个记录需要相同的时间来处理。
  • 我们刚刚使用了AJAX请求来从服务器中查找:
    1. UTC中的开始时间
    2. 要处理的记录总数
    3. 已经处理过的记录数

我们如何使用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";
}

相关内容

  • 没有找到相关文章

最新更新