Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Javascript > adding 2 times together

Reply
Thread Tools

adding 2 times together

 
 
Stormkid
Guest
Posts: n/a
 
      09-27-2004
Hey Gang, I'm trying to figure out the best way to add two times together of
the format hh:mm:ss any suggestions would be great thanks Todd


 
Reply With Quote
 
 
 
 
Ivo
Guest
Posts: n/a
 
      09-27-2004
"Stormkid" <(E-Mail Removed)> wrote in message
news:41586752$0$286$(E-Mail Removed) .net...
> Hey Gang, I'm trying to figure out the best way to add two times together

of
> the format hh:mm:ss any suggestions would be great thanks Todd
>


Convert all to seconds, add, then convert back. This way you can easily add
a third time later. For example:

var t1='12:34:56';
var t2='10:10:03';

t1=t1.split(/\D/);
t2=t2.split(/\D/);
var x1=parseInt(t1[0])*60*60 + parseInt(t1[1])*60 + parseInt(t1[2]);
var x2=parseInt(t2[0])*60*60 + parseInt(t2[1])*60 + parseInt(t2[2]);
var s=x1+x2;
var m=Math.floor(s/60); s=s%60;
var h=Math.floor(m/60); m=m%60;
var d=Math.floor(h/24); h=h%24;
alert(d+':'+h+':'+m+':'+s);

You may wish to add leading zero's to numbers below 10 etc.
--Iv


 
Reply With Quote
 
 
 
 
Fred Oz
Guest
Posts: n/a
 
      09-27-2004
Ivo wrote:
[snip]
>
> Convert all to seconds, add, then convert back. This way you can easily add
> a third time later. For example:

[snip]

Here is a modification of Ivo's example, I've created toSec(), toHr()
and toDay() functions. Of course there is no input validation and the
actual functions can probably be made more efficient.

You may still want to add leading zeros and include either toHr() or
toDay(), not both.

It is also more correct to use

this.form.elements['time1'].value

rather than the shorter but probably just as reliable:

this.form.time1.value


Cheers, Fred.

<script type="text/javascript">
function toSec(t) {
var b = t.split(/\D/);
return (+b[0])*60*60 + (+b[1])*60 + (+b[2]);
}

function toHr(s){
var m = Math.floor(s/60);
var h = Math.floor(m/60);
return h + ':' + m%60 + ':' + s%60;
}

function toDay(s){
var m = Math.floor(s/60);
var h = Math.floor(m/60);
var d = Math.floor(h/24);
return d + ':' + h%24 + ':' + m%60 + ':' + s%60;
}
</script>

<p>Enter times of format: hh:mm:ss</p>
<form name="fred" action="">
<input type="text" name="time1" cols="10">&nbsp;&nbsp;
<input type="text" name="time2" cols="10"><br>
<input type="button" value="Add times" onclick="
alert('Hours: ' + toHr(toSec(this.form.time1.value)
+ toSec(this.form.time2.value))
+ '\nDays: ' + toDay(toSec(this.form.time1.value)
+ toSec(this.form.time2.value)));
">
</form>
 
Reply With Quote
 
RobG
Guest
Posts: n/a
 
      09-27-2004
Fred Oz wrote:

[snip]
> You may still want to add leading zeros ...

[snip]


Here's an "add leading zeros" function that will add a
leading zero if the number passed has only one digit:

function addZero(x) {
if (String(x).length < 2) x = '0' + x;
return x;
}


Use it like this in toHr()

return addZero(h) + ':' + addZero(m%60) + ':'
+ addZero(s%60);


Rob
 
Reply With Quote
 
Hal Rosser
Guest
Posts: n/a
 
      09-28-2004
The result would be undefined
Why would you want to add - say 11:55pm to 7:36am ?
I could see adding 2 hours and 45 minutes to a time, or something like that.
Please clue us in on your purpose

"Stormkid" <(E-Mail Removed)> wrote in message
news:41586752$0$286$(E-Mail Removed) .net...
> Hey Gang, I'm trying to figure out the best way to add two times together

of
> the format hh:mm:ss any suggestions would be great thanks Todd
>
>



---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.770 / Virus Database: 517 - Release Date: 9/27/2004


 
Reply With Quote
 
Dr John Stockton
Guest
Posts: n/a
 
      09-28-2004
JRS: In article <41586752$0$286$(E-Mail Removed) >,
dated Mon, 27 Sep 2004 14:17:40, seen in news:comp.lang.javascript,
Stormkid <(E-Mail Removed)> posted :
>Hey Gang, I'm trying to figure out the best way to add two times together of
>the format hh:mm:ss any suggestions would be great thanks Todd


It makes no sense to add times, but it is perfectly OK to add durations.

The following illustrates what may be the shortest codes, for totals
less than 24 hours :-

D0 = "1970/1/3 " ; G = " GMT"
T1 = "11:22:33"
T2 = "01:55:44"

T3 = (new Date(+new Date(D0+T1+G) + +new Date(D0+T2+G))).toGMTString().m
atch(/\d\d:\d\d:\d\d/)

T3 = (new Date(+new Date(D0+T1+G) + +new Date(D0+T2+G))).toGMTString().s
ubstr(16,

The second makes more assumptions. Both are slightly tested.


The method of Iv (Ivo) fails if any field is 08 or 09 (FAQ 4.12). Using
parseInt() serves no purpose for hh & mm, and a unary + is enough for
ss.

Fred's looks OK apart from leading zeroes; I think that it has two
superfluous (+ ) .

Rob's usable leading zero function has the defects that it sometimes
returns a string & sometimes a number, and that if it returns a number
the number-to-string conversion will be repeated. Consider
if ((x=String(x)).length < 2) x = '0' + x;

<FAQENTRY> Optimal LZ function needed!

--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.
 
Reply With Quote
 
rh
Guest
Posts: n/a
 
      09-29-2004
Dr John Stockton wrote:
<...>
> and that if it returns a number
> the number-to-string conversion will be repeated. Consider
> if ((x=String(x)).length < 2) x = '0' + x;
>
> <FAQENTRY> Optimal LZ function needed!


Optimal is always desirable, but it seems that there is often no
single optimally efficient computation, and/or optimally expressed
computation, because of the variations in the ways in which JS engines
peform in different browsers. Whether, for example, a type conversion
is carried out more than once may be less important regarding
computational efficiency than the actual expression used to manifest
the result.

In this given case, differences in performance will likely occur based
on whether the input value is provided as a string or as an integer.
A couple of alternatives to your suggestion above, always returning a
string, are:

x = "" + (-(x > 9) && "") + +x;

and

x = x < 10 ? "0" + +x : "" +x;

with the former being somewhat oblique, but reasonably efficient (and
just slightly different in the treatment of extraneous leading zeros
in the input string), while the latter is expressed more clearly, and
is more efficient with string input. The latter, without saying it is
the best that can be done, should also provide better balance of
efficient computation across browsers and input type.

../rh
 
Reply With Quote
 
Dr John Stockton
Guest
Posts: n/a
 
      09-29-2004
JRS: In article <(E-Mail Removed) >,
dated Tue, 28 Sep 2004 19:24:33, seen in news:comp.lang.javascript, rh
<(E-Mail Removed)> posted :
>Dr John Stockton wrote:
><...>
>> and that if it returns a number
>> the number-to-string conversion will be repeated. Consider
>> if ((x=String(x)).length < 2) x = '0' + x;
>>
>> <FAQENTRY> Optimal LZ function needed!

>
>Optimal is always desirable, but it seems that there is often no
>single optimally efficient computation, and/or optimally expressed
>computation, because of the variations in the ways in which JS engines
>peform in different browsers. Whether, for example, a type conversion
>is carried out more than once may be less important regarding
>computational efficiency than the actual expression used to manifest
>the result.
>
>In this given case, differences in performance will likely occur based
>on whether the input value is provided as a string or as an integer.


In the overwhelming majority of cases, the programmer will know whether
the input is a string or an integer.

The Leading Zero function is essentially a function for integer input.
If such string padding is wanted, it can either be done using a general
string padder, or an optimised string padder, or by tolerably
inefficient use of an integer function.

Rob's, omitting String( ) , is presumably optimum for strings.

One important question is whether it is *certain* that the number input
will be an integer in 0..99. If it is *certain* - which is the case for
getHours, etc. - then more methods become available, such as adding 100,
converting to string, and taking the last two characters (which is the
fastest way I know in MSIE4 VBscript). Otherwise, I would choose to
preserve the numerical value at the expense of format.

>A couple of alternatives to your suggestion above, always returning a
>string, are:
>
> x = "" + (-(x > 9) && "") + +x;
>
>and
>
> x = x < 10 ? "0" + +x : "" +x;
>
>with the former being somewhat oblique, but reasonably efficient (and
>just slightly different in the treatment of extraneous leading zeros
>in the input string), while the latter is expressed more clearly, and
>is more efficient with string input. The latter, without saying it is
>the best that can be done, should also provide better balance of
>efficient computation across browsers and input type.


The second + seems unnecessary in the latter.

For non-negative integers,
'0'.substring(X>=10)+X // short but slow?
'0'.substr(X>=10)+X // shorter but slow?
I use
function LZ(x) { return (x<0||x>=10?"":"0") + x }


--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.
 
Reply With Quote
 
rh
Guest
Posts: n/a
 
      09-30-2004
Dr John Stockton wrote:

> <(E-Mail Removed)> posted :
> >Dr John Stockton wrote:
> ><...>
> >> and that if it returns a number
> >> the number-to-string conversion will be repeated. Consider
> >> if ((x=String(x)).length < 2) x = '0' + x;
> >>
> >> <FAQENTRY> Optimal LZ function needed!

> >
> >Optimal is always desirable, but it seems that there is often no
> >single optimally efficient computation, and/or optimally expressed
> >computation, because of the variations in the ways in which JS engines
> >peform in different browsers. Whether, for example, a type conversion
> >is carried out more than once may be less important regarding
> >computational efficiency than the actual expression used to manifest
> >the result.
> >
> >In this given case, differences in performance will likely occur based
> >on whether the input value is provided as a string or as an integer.

>
> In the overwhelming majority of cases, the programmer will know whether
> the input is a string or an integer.
>


Possibly. But perhaps in a typeless language, in the overwhelming
majority of cases, it shouldn't be necessary for the programmer to
differentiate between the two. If it is, then it seems most sensible
to present the utility a prototype of the core object (not that you've
suggested anything to the contrary).

> The Leading Zero function is essentially a function for integer input.
> If such string padding is wanted, it can either be done using a general
> string padder, or an optimised string padder, or by tolerably
> inefficient use of an integer function.
>
> Rob's, omitting String( ) , is presumably optimum for strings.


Somewhat surprisingly, it appears not to be. And that's what I meant
when saying "optimal" is hard to achieve as it depends on which JS
engine is performing the computation. Outside IE, computation
efficiency of that expression in several of the more popular browsers
(even with String() omitted) ranges in my tests from slow to dismal.

The point is that it is non-trivial to assess computational efficiency
by simply looking at the operations in an expression.

>
> One important question is whether it is *certain* that the number input
> will be an integer in 0..99. If it is *certain* - which is the case for
> getHours, etc. - then more methods become available, such as adding 100,
> converting to string, and taking the last two characters (which is the
> fastest way I know in MSIE4 VBscript). Otherwise, I would choose to
> preserve the numerical value at the expense of format.
>
> >A couple of alternatives to your suggestion above, always returning a
> >string, are:
> >
> > x = "" + (-(x > 9) && "") + +x;
> >
> >and
> >
> > x = x < 10 ? "0" + +x : "" +x;
> >

<...>
>
> The second + seems unnecessary in the latter.


It's there to allow for a string with extraneous leading zeros, e.g.,
input of "09", which would be returned as "009" otherwise.

>
> For non-negative integers,
> '0'.substring(X>=10)+X // short but slow?
> '0'.substr(X>=10)+X // shorter but slow?


Also, perhaps:

["0",""][+(x>=10)]+x; // short but (surprisingly) slow

> I use
> function LZ(x) { return (x<0||x>=10?"":"0") + x }


Which is good, probably optimal -- to be improved only by making it a
prototype .

../rh
 
Reply With Quote
 
Dr John Stockton
Guest
Posts: n/a
 
      09-30-2004
JRS: In article <(E-Mail Removed) >,
dated Wed, 29 Sep 2004 19:34:50, seen in news:comp.lang.javascript, rh
<(E-Mail Removed)> posted :

> But perhaps in a typeless language, in the overwhelming
>majority of cases, it shouldn't be necessary for the programmer to
>differentiate between the two.


It is trivial, efficient, and not necessary.

> If it is, then it seems most sensible
>to present the utility a prototype of the core object (not that you've
>suggested anything to the contrary).


To suit all cases, ISTM that it would need to be added to String and
Number. It's briefer to use LZ(D.getDate()) than D.getDate().LZ(), too!


>> The Leading Zero function is essentially a function for integer input.
>> If such string padding is wanted, it can either be done using a general
>> string padder, or an optimised string padder, or by tolerably
>> inefficient use of an integer function.
>>
>> Rob's, omitting String( ) , is presumably optimum for strings.

>
>Somewhat surprisingly, it appears not to be.


It would become
function addZero(x) { if (x.length < 2) x = '0' + x ; return x }

function addZero(x) { return x.length < 2 ? '0' + x : x }

is perhaps better, though.

> And that's what I meant
>when saying "optimal" is hard to achieve as it depends on which JS
>engine is performing the computation. Outside IE, computation
>efficiency of that expression in several of the more popular browsers
>(even with String() omitted) ranges in my tests from slow to dismal.


In comparison with ???

>The point is that it is non-trivial to assess computational efficiency
>by simply looking at the operations in an expression.


Indeed. The easiest way is to post it here, claim it as good, and wait
for results.

--
John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4
<URL:http://www.jibbering.com/faq/> JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
When to use std::pow(x,n) instead of times x for n times? Peng Yu C++ 17 09-14-2008 04:10 PM
Forms Authentication Fails some times and not some times??? =?Utf-8?B?bWF2cmlja18xMDE=?= ASP .Net 0 03-28-2006 10:48 PM
SetAuthCookie works some times and fails some times? =?Utf-8?B?bWF2cmlja18xMDE=?= ASP .Net 0 03-23-2006 09:24 PM
Boot Times and Recycle Times Moo Digital Photography 3 11-20-2004 12:31 PM
Why is the Constructor called 4 times but the Destructor 5 times? djskrill C++ 9 10-01-2003 07:18 PM



Advertisments