Hello and welcome to our community! Is this your first visit?
Enjoy an ad free experience by logging in. Not a member yet? Register.

# Thread: Time-Remaining(ETA) Calculation: how to prevent fluctuating numbers?

1. ## Time-Remaining(ETA) Calculation: how to prevent fluctuating numbers?

In the script below, I've highlighted the sections pertaining to the calculation -- which is:

total increment = n

elapsed increment = i

remaining increment = n - i

elapsed time = (currentTime - startTime)

execution rate = (elapsed increment / elapsed time)

time remaining = (remaining increment / execution rate)
------------------------------------------------------------
ETA = ((n - i) / (i / (new Date().getTime() - startTime)));
------------------------------------------------------------

Fluctuating Numbers:

What I mean by this is, the higher the number(n), the more uncertain the calculated time seems to become, causing a visibly erratic display.

The only thing I could think of doing was to show the value less often, such as:

if(i % 10 == 0){output calculation...}

-- but that only reduces the visual blur, and tends to make the countdown look out of sync.

So, anyway, I'd just like to know if anyone has ideas for accomplishing this without those side-effects.

The loop value is set at an extremely large number to emphasise said behavior:

Code:
```<html>
<title>-</title>

<script type="text/JavaScript">

var i, interval, stop;

function Recurse(n, startTime, oForm){
var ETA, H, M, m, S, s;
i++;

ETA = ((n - i) / (i / (new Date().getTime() - startTime)));

H = new Date(ETA).getUTCHours();
M = new Date(ETA).getMinutes();
S = new Date(ETA).getSeconds();

M < 10 ? m = "0" + M : m = M;
S < 10 ? s = "0" + S : s = S;

oForm.timeRem.value = H + ":" + m + ":" + s;

oForm.progress.value = i;
oForm.percentage.value = Math.floor(((i / n) * 100)) + "%";
if (i >= n || stop){controlUpdate("Complete");}
}

function controlUpdate(callString){
var oForm, n, startTime;
oForm = document.timeTest;

switch(callString){

case "Start" :
n = new Number(oForm.test.value);
if(isNaN(n) || n < 1){
alert("loop value must be a number greater than 0. ");
}
else{
i = 0;
stop = false;
oForm.cancel.disabled = 0;
oForm.start.disabled = 1;
oForm.test.disabled = 1;
startTime = new Date().getTime();
interval = setInterval(function(){Recurse(n, startTime, oForm);},1);
}
break;

case "Cancel" :
clearInterval(interval);
stop = true;
oForm.rs.disabled = 0;
oForm.cancel.disabled = 1;
break;

case "Complete" :
clearInterval(interval);
oForm.rs.disabled = 0;
break;

case "Reset" :
oForm.cancel.disabled = 1;
oForm.start.disabled = 0;
oForm.test.disabled = 0;
oForm.rs.disabled = 1;
break;}
}
</script>

<style type="text/css">
form{
text-align:center
}
input{
text-align:center;vertical-align:middle
}
label{
}
</style>

<body>

<form name="timeTest" onreset="controlUpdate('Reset')">
<br><br>
<br><br>
<label>loop :</label><input name="test" value="999999" size="10" maxlength="7">
<input name="start" type="button" value="Start" onclick="controlUpdate('Start')">
<input name="cancel" type="button" value="Cancel" disabled onclick="controlUpdate('Cancel')">
<input name="rs" type="reset" disabled>
</form>

</body>
</html>```

• I got it!
...

var t, ETA, H, M, m, S, s;
i++;
t = new Date().getTime() - startTime;

if(t % 1000 == 0){
ETA = ((n - i) / (i / t));
H = new Date(ETA).getUTCHours();
M = new Date(ETA).getMinutes();
S = new Date(ETA).getSeconds();
M < 10 ? m = "0" + M : m = M;
S < 10 ? s = "0" + S : s = S;
oForm.timeRem.value = H + ":" + m + ":" + s;
}

...

•

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•