Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsGeneralPHPASPPerlColdFusionFlashHTML, CSS, ScriptsBrowsers

Webmaster Forum / HTML, CSS, Scripts / JavaScript / February 2005



Tip: Looking for answers? Try searching our database.

countdown starts to count up after zero

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Michael - 02 Feb 2005 04:00 GMT
I have this script that works the way I want except for one thing... Once it
hits zero it starts to count up and looks like this:

-1:0-1:0-1:0-18 with the last number counting up.

Can anyone help me find a way to stop it at zero?

Thank you,

Mike

<SCRIPT>
<!--
var timeInMin = "1"; //The minutes the count down should run.

var theDay = new Date()
var countDown = theDay.getTime()+(1000*60*timeInMin);
var TimeTill //The string that is going to put all numbers together and make
sense.

function countdown()
{
var today = new Date() //Create an Date Object that contains today's date.
var second = Math.floor((countDown - today.getTime())/1000)
/*Use getTime() to get the milisecond (1/1000 of a second) from now to
theDay.
and devide it into 1000 to get the seconds from now to theDay.*/

var minute = Math.floor(second/60) //Devide "second" into 60 to get the
minute
var hour = Math.floor(minute/60) //Devide "minute" into 60 to get the hour
var day = Math.floor(hour/24) //Devide "hour" into 60 to get the day

CDay= day //Correct day
CHour= hour % 24 //Correct hour, after devide into 24, the remainder
deposits here.
CMinute= minute % 60 //Correct minute, after devide into 60, the remainder
deposits here.
CSecond= second % 60 //Correct second, after devide into 60, the remainder
deposits here.

var TimeTill = "";

if(CDay)
{
TimeTill += CDay + ":";
}
if(CHour || CDay)
{
if(CHour < 10)
{
TimeTill += "0";
}
TimeTill += CHour + ":";
}
if(CMinute < 10)
{
TimeTill += "0";
}
TimeTill += CMinute + ":";
if(CSecond < 10)
{
TimeTill += "0";
}
TimeTill += CSecond;

document.clock.countdown.value = TimeTill //Make the particular form chart
become "Daytill"
var counter = setTimeout("countdown()", 1000) //Create the timer "counter"
that will automatic restart function countdown() again every second.
}
//-->
</SCRIPT>
Fred Oz - 02 Feb 2005 07:11 GMT
> I have this script that works the way I want except for one thing... Once it
> hits zero it starts to count up and looks like this:
[...]

 Have a poke around Dr. John's site here:

   <URL:http://www.merlyn.demon.co.uk/js-dates.htm>

 See if you can't remove 75% of your code.

Signature

Fred

Dr John Stockton - 02 Feb 2005 16:37 GMT
JRS:  In article <z9WdnYWCEOJu0p3fRVn-3A@comcast.com>, dated Tue,
1 Feb 2005 21:00:32, seen in news:comp.lang.javascript, Michael
<none@none.com> posted :
>I have this script that works the way I want except for one thing... Once it
>hits zero it starts to count up and looks like this:
>
>-1:0-1:0-1:0-18 with the last number counting up.
>
>Can anyone help me find a way to stop it at zero?

>function countdown()
>{
>var today = new Date() //Create an Date Object that contains today's date.
>var second = Math.floor((countDown - today.getTime())/1000)

if (second<0) return // might well do it

> ...

Code should be indented to show structure.  Read the newsgroup FAQ.

>var counter = setTimeout("countdown()", 1000) //Create the timer "counter"
>that will automatic restart function countdown() again every second.

It will not, in at least some browsers; the delay has overheads.  To get
the right overall delay always, and to display every second, you *must*
resynchronise.

>}

Rather than going to all that trouble to generate the display, how about
determining the initial delay D in seconds,
 X = new Date(0,0,1,0,0,D) ;
then, at each seconds tick   X.setSeconds(X.getSeconds()-1) ;
and use   s = String(X).replace(/.*(\d)[^0-9]*([0-9:]{8}).*/, "$1-$2")
to generate the output as   2-16:06:22   - it assumes the count is less
than 10 days, and needs more testing; it assumes the day is the first
digits field, and the time is non-FFF.
Perhaps too risky.

But even better, in the loop use :
d = String(new Date(0,0,20,0,0,D--))
d = d.replace(/.*(\d)[^0-9]*([0-9:]{8}).*/, "$1-$2")
will generate a string like 0-00:00:10 but one second less each time;
stop when D<0.

Signature

© 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.

RobG - 03 Feb 2005 01:11 GMT
[...]
>>var counter = setTimeout("countdown()", 1000) //Create the timer "counter"
>>that will automatic restart function countdown() again every second.
>
> It will not, in at least some browsers; the delay has overheads.  To get
> the right overall delay always, and to display every second, you *must*
> resynchronise.

 Or run the function with an interval of say 200 so
 synchronization jumps are not noticeable.

 The OP may be interested in the following counter that gives the
 years, months, days, hours, minutes and seconds from now to a
 chosen date.  It doesn't allow for Dr. J's favoured leap
 seconds, but anyone who notices shouldn't be using a JavaScript
 function for their timer...

 It runs in less than 1 ms on a (reasonably new) Wintel box, so
 it may as well run the full function each time.  It means
 modifying the numbers in the form changes the countown without
 re-clicking the button (more an artifact than a feature...)

 <html><head><title>play</title>
 <script type="text/javascript">

 // Stop date/time must be after
 // current date/time.
 function dateDiff(){

 // Gets a stop date/time from form 'f'
 // Caution: zero validation on input
 var f = document.forms['dateFields'];
 var s = new Date(
     f.Yr.value,
     f.Mn.value - 1,
     f.Dy.value,
     f.Hr.value,
     f.Min.value,
     f.Sec.value
     );

 var ele = document.getElementById('result') ||
           document.all('result');

 var n = new Date();
 if (s < n) {
   ele.innerHTML = '<b>Bzzzzt!!!</b><br>'
                 + 'Alarm is ringing...';
   return false;
 }

 // Diff years
 var dyr = s.getFullYear() - n.getFullYear();
 s.setFullYear(s.getFullYear() - dyr);
 if (s < n) dyr -= 1;

 // Diff months
 var dmn = (s.getMonth() - n.getMonth() + 12) % 12;
 s.setMonth(n.getMonth());
 if (s < n) {
   s.setMonth(+s.getMonth() + 1);
   dmn -=1;
   if (dmn < 0) dmn -= -12;
 }

 var tsec = Math.floor((s.getTime() - n.getTime()) / 1000);
 var dsec = Math.floor(tsec % 60);
 var dmin = Math.floor(tsec/60 % 60);
 var dhr  = Math.floor(tsec/3600 % 24);
 var ddy  = Math.floor(tsec/86400);

 ele.innerHTML = 'Time left:'
  + ' '  + dyr  + ' year'   + addS(dyr)
  + ', ' + dmn  + ' month'  + addS(dmn)
  + ', ' + ddy  + ' day'    + addS(ddy)
  + ', ' + dhr  + ' hour'   + addS(dhr)
  + ', ' + dmin + ' minute' + addS(dmin)
  + ', ' + dsec + ' second' + addS(dsec);

 setTimeout("dateDiff()", 200);
 }

 function addS(x) {
 return (x != 1)? 's':'';
 }

 </script>

 </head><body>
 <form action="" name="dateFields">
   <input type="text" size="8" name="Yr"  value="2006">Year<br>
   <input type="text" size="8" name="Mn"  value="02">Month<br>
   <input type="text" size="8" name="Dy"  value="05">Day<br>
   <input type="text" size="8" name="Hr"  value="12">Hour<br>
   <input type="text" size="8" name="Min" value="00">Min<br>
   <input type="text" size="8" name="Sec" value="00">Sec<br>
   <input type="button" value="Calc"
          onclick="dateDiff()">
   <input type="reset">
 </form>
 <br>
 <span id="result">result will appear here...</span>
 </body></html>

Signature

Rob

RobG - 03 Feb 2005 02:05 GMT
[...]

>  var tsec = Math.floor((s.getTime() - n.getTime()) / 1000);
>  var dsec = Math.floor(tsec % 60);
>  var dmin = Math.floor(tsec/60 % 60);
>  var dhr  = Math.floor(tsec/3600 % 24);
>  var ddy  = Math.floor(tsec/86400);

 Slight modification required here.  Because milliseconds are
 truncated, the counter is one second ahead of itself. Fix:

   var tsec = Math.floor((s.getTime() - n.getTime()) / 1000) + 1;
   var dsec = Math.floor(tsec % 60) ;
   var dmin = Math.floor(tsec/60 % 60);
   var dhr  = Math.floor(tsec/3600 % 24);
   var ddy  = Math.floor(tsec/86400);

Signature

Rob

Dr John Stockton - 03 Feb 2005 21:58 GMT
JRS:  In article <hTeMd.389$Ud4.31582@news.optus.net.au>, dated Thu, 3
Feb 2005 01:11:41, seen in news:comp.lang.javascript, RobG
<rgqld@iinet.net.auau> posted :

I believe that your posting agent is acting injudiciously.  It gives in
your header a line
       X-Trace: news.optus.net.au 1107393101 203.15.126.10
        (Thu, 03 Feb 2005 12:11:41 EST)
Now, although we know that EST is Eastern Standard Time as used in the
East, where the clocks are ahead of Greenwich, there's a chronologically
retarded and rather vociferous gang (some of them were led by the
esteemed Mr Giuliani) who believe that there is an East in the West, and
hence locally use a form of EST and will be loth to believe in any
other.

>[...]
>>>var counter = setTimeout("countdown()", 1000) //Create the timer "counter"
[quoted text clipped - 6 lines]
>  Or run the function with an interval of say 200 so
>  synchronization jumps are not noticeable.

Some people have no sense of rhythm !!

>  The OP may be interested in the following counter that gives the
>  years, months, days, hours, minutes and seconds from now to a
>  chosen date.

What happens if the start date is June 2005 and the finish is Xmas 2005
when your clock jumps an hour forwards in the middle of the countdown?

>  It doesn't allow for Dr. J's favoured leap
>  seconds, but anyone who notices shouldn't be using a JavaScript
>  function for their timer...

???  One cannot deal with leap seconds using standard javascript (or PC,
Windows, etc.) routines; though one should be aware of them.

>  var ele = document.getElementById('result') ||
>            document.all('result');

For a single use, that looks better than
       if (document.all && !document.getElementById) { // e.g. IE4
         document.getElementById = function(id) {
           return document.all[id] } }

I suppose the latter is better if getElementById is wanted at many
times/places?

I'm revising js-date1.htm on difference in Y M D, and have reached

function DiffDateC(A1, A2) { var dm, dd
 dm = (12*A1[0]+A1[1]) - (12*A2[0]+A2[1]) ; dd = A1[2] - A2[2]
 if (dd<0) { dm-- ; dd += DaysInMonth(A1[0], A1[1]-1) } // **
 return [(dm/12)|0, dm%12, dd] }

Parameters and return are [Y,M,D]; note the ease of dealing with year
borrows.  Note the light use of Date Object; only if the month length is
needed, and discussions last year showed how brief explicit code can do
that faster.  Any comment?

Note that the YMD from, say, 2005-04-04 to 2005-06-03 differs from that
for the reversed interval of 2005-06-03 to 2005-04-04.

Signature

© 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.

Matthew Lock - 04 Feb 2005 01:02 GMT
> I believe that your posting agent is acting injudiciously.  It gives in
> your header a line
[quoted text clipped - 6 lines]
> hence locally use a form of EST and will be loth to believe in any
> other.

The poster's EST probably refers to Eastern Summer Time (or is that
Eastern Standard Time?) in Australia.
RobG - 28 Feb 2005 14:59 GMT
> JRS:  In article <hTeMd.389$Ud4.31582@news.optus.net.au>, dated Thu, 3
> Feb 2005 01:11:41, seen in news:comp.lang.javascript, RobG
[quoted text clipped - 10 lines]
> hence locally use a form of EST and will be loth to believe in any
> other.

 Gosh, there I was, trolling through some old posts when...

 Sorry Dr. J, I missed this reply.  Yes, the time zone should
 more correctly be AEST, as in Australian Eastern Standard Time,
 but Mac OS X does not give me the facility to change it via the
 GUI.

 eBay would have it that for a good portion of the year, I am in
 AEDST, which everyone else I know of thinks is AEDT, but there
 you go.  If you can quote me a definitive reference for timezone
 abbreviations I'd be very grateful.

 No doubt I could poke around in the guts of the underlying
 FreeBSD/Darwin core and get the timezone to report something
 more appropriate, but despite thoroughly missing my distant UNIX
 past, I'm not about to try it.

[...]

> What happens if the start date is June 2005 and the finish is Xmas 2005
> when your clock jumps an hour forwards in the middle of the countdown?

 Ah, but you assume that I am somewhere that daylight saving will
 affect my reference to UT - but you'd be wrong.  :-)

 I get your point, for some folk, the clock will leap backward an
 hour.  I guess times should be reduced to UTC/GMT before doing
 any calculation.

[...]
> I'm revising js-date1.htm on difference in Y M D, and have reached
>
[quoted text clipped - 7 lines]
> needed, and discussions last year showed how brief explicit code can do
> that faster.  Any comment?

 Very neat, but a similar algorithm is required to account for
 hours, minutes & seconds.

  function DiffTime(T1,T2) {
  var dt = (T2[0]-T1[0]+24)*3.6e3+(T2[1]-T1[1])*60+(T2[2]-T1[2]);
  return ([
         (dt/8.64e4) | 0,           // days
         Math.floor(dt/3.6e3) % 24, // hours
         Math.floor(dt/60) % 60,    // mins
         dt % 60                    // secs
         ]);
 }

 Which expects time in as [h,m,s] and returns [d,h,m,s]. It
 expects the finish time to be the day following the start time.

 A start time of 23:00:00 and finish of 01:00:00 returns 0,2,0,0
 The reverse returns 1,22,0,0.
 The time difference should never exceed 2,0,0,0
 (00:00:00 to 24:00:00)

Signature

Rob

Dr John Stockton - 28 Feb 2005 20:59 GMT
JRS:  In article <42233282$0$4776$5a62ac22@per-qv1-newsreader-
01.iinet.net.au>, dated Tue, 1 Mar 2005 00:59:32, seen in
news:comp.lang.javascript, RobG <rgqld@iinet.net.auau> posted :
>> JRS:  In article <hTeMd.389$Ud4.31582@news.optus.net.au>, dated Thu, 3
>> Feb 2005 01:11:41, seen in news:comp.lang.javascript, RobG
[quoted text clipped - 22 lines]
>  you go.  If you can quote me a definitive reference for timezone
>  abbreviations I'd be very grateful.

I don't know of one; but since there are duplicates in the abbreviations
actually used world-wide, it would not be very useful.  I have seen such
a list; but, being of NA origin, it included only NA zones.

The military system of single-letter suffixes is well-defined - which
makes one wonder how the US forces manage in Afghanistan, 4.5 hours from
GMT - that may use J.  What I know is in <URL:http://www.merlyn.demon.co
.uk/misctime.htm#Zones>.

Preferred practice is to use only UTC/GMT triliterals, and otherwise to
give the offset numerically.

>> I'm revising js-date1.htm on difference in Y M D, and have reached
>>
>> function DiffDateC(A1, A2) { var dm, dd

>  Very neat, but a similar algorithm is required to account for
>  hours, minutes & seconds.

That's of little interest, because it is so easy.  Already on that page.

There is just the question, shared with Date, of whether one wants civil
or true difference - in the civil case, there are 24 hours in every day,
but one of them may be empty or occur twice.

For Date, present view is that the calculation should depend on whether
the wish is for days-since or for days-until; it affects which month
gets borrowed.

Signature

© John Stockton, Surrey, UK.  ?@merlyn.demon.co.uk   Turnpike v4.00   MIME. ©
Web  <URL:http://www.merlyn.demon.co.uk/> - w. FAQish topics, links, acronyms
PAS EXE etc : <URL:http://www.merlyn.demon.co.uk/programs/> - see 00index.htm
Dates - miscdate.htm moredate.htm js-dates.htm pas-time.htm critdate.htm etc.

 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.