Avatar billede -kenner- Nybegynder
09. august 2005 - 11:36 Der er 25 kommentarer og
1 løsning

Nedtælling i dage, timer, minutter og sekunder

Hej eksperter,

Jeg står og mangler et nedtællingsscript, som skal tælle ned til et specifikt tidspunkt, som ligger flere dage fremme.

Når dette tidspunkt er overskredet, skal den bare skrive "Tids punktet er overskredet".
Avatar billede dotcom1 Nybegynder
09. august 2005 - 15:38 #2
Kan dette bruges:

<?php
//--------------------------
// countdown function
// Note: Unix timestamp limitations
// Date range is from
// the year 1970 to 2038
//--------------------------

// Set countdown time: parameters: (year, month, day, hour, minute)
countdown(2005,9,17,12,00);

function countdown($year, $month, $day, $hour, $minute)
{
  // make a unix timestamp for the given date
  $the_countdown_date = mktime($hour, $minute, 0, $month, $day, $year, -1);

  // get current unix timestamp
  $today = time();

  $difference = $the_countdown_date - $today;
  if ($difference < 0) $difference = 0;

  $days_left = floor($difference/60/60/24);
  $hours_left = floor(($difference - $days_left*60*60*24)/60/60);
  $minutes_left = floor(($difference - $days_left*60*60*24 - $hours_left*60*60)/60);
 
  /* Sæt datoformat til dansk */
  setlocale(LC_ALL, 'da_DK.ISO_8859-1');
 
  // OUTPUT
  echo "Datoen i dag: ".strftime("%e. %B %Y, "."kl."." %H:%M.")."<br/>";
  echo "Nedtælling til: ".strftime("%e. %B %Y, "."kl."." %H:%M.",$the_countdown_date)."<br/>";
  echo "<font color= #ff9900>".$days_left." dage ".$hours_left." timer og ".$minutes_left." minutter</font>.";
}
?>
Avatar billede -kenner- Nybegynder
12. august 2005 - 12:01 #3
Jeg vil gerne have en konstant nedtælling, så der skal nok blandes noget javascript ind i.
Avatar billede nielle Nybegynder
12. august 2005 - 12:10 #4
Så var det jo nok ikke den helt rigtige kategori at poste spørgsmålet i, men pyt:

Counter: <span id="counter"></span>

<script language='JavaScript'>
timeId = 0;
function updateCounter()
{
    // Nu
    d1 = new Date();
    ms1 = d1.getTime();

    // Fremtidig dato
    d2 = new Date(2005, 7, 4, 31, 0, 0, 0);  // August=7, ikke 8!
    ms2 = d2.getTime();

    // Sekunder
    dms = ms2-ms1;
    ds = dms/1000;

    document.getElementById("counter").innerHTML = (ds > 0) ? ds : "Tids punktet er overskredet";
    timeId = setTimeout('updateCounter();', 1000);
};

updateCounter();
</script>
Avatar billede -kenner- Nybegynder
12. august 2005 - 12:46 #5
Hvorfor er august 7 ?


Kan du ikke lige fortælle hvad der er hvad? Altså værdierne i funktionen: Date(2005, 7, 4, 31, 0, 0, 0);
Avatar billede roenving Novice
12. august 2005 - 13:16 #6
Det er godt nok en underlig en, jeg tror nielle har lavet en tavetosse, for det vil være d. 4/8-2005 kl. 31 !-)

-- og javascripts Date-objekt er lavet sådan, at måneder angives som index til månedsnavnet, og da alle javascript-arrays er 0-baserede, bliver januar 0, august 7 og december 11 !-)

Men ellers kan du måske få gavn af mine Date-udvidelser: http://roenving.users.whitehat.dk/date/roenvingDate.html

-- prøv i det felt, der hedder reference at indskrive den dato, du vil have det til at tælle ned til, så vil du under .age() se at der aktivt tælles ned (husk det der med at måneden skal være en mindre !-)

-- så skal der bare tilføjes mekanismen, som reagerer, når det er overskredet !o]
Avatar billede nielle Nybegynder
12. august 2005 - 13:30 #7
Denne gang med passende kommentarer og fejlrettelser:

Counter: <span id="counter"></span>

<script language='JavaScript'>
timeId = 0;
function updateCounter()
{
    // Finder tidspunktet lige nu.
    d1 = new Date();
    ms1 = d1.getTime();

    // Dette er det fremtidige tidspunkt hvor nedtætt stopper.
    // Parametrene er: år, måned, dag, timer, minutter, sekunder, og millisekunder
    // Januar har værdien 0, så derfor er august 7 og ikke 8.
    d2 = new Date(2005, 7, 31, 0, 0, 0, 0);  // Tak til roenving for at spotte den fejl :^)
    ms2 = d2.getTime();

    // Udregn differencen de to tidspunkter.
    dms = ms2-ms1;

    // Omregn fra millisekunder til sekunder.
    ds = dms/1000;

    // Hvis værdien i ds er større end 0 udskrives tiden via
    // span'en i toppen, og ellesr udskrives udløbs-beskeden.
    document.getElementById("counter").innerHTML = (ds > 0) ? ds : "Tids punktet er overskredet";

    // Vent 1000 milisekunder, altså 1 sekund, før at der tælles op igen.
    timeId = setTimeout('updateCounter();', 1000);
};

updateCounter();
</script>
Avatar billede roenving Novice
12. august 2005 - 13:33 #8
-- og man skal vel stoppe timeren, hvis tiden er overskredet ?-)
Avatar billede nielle Nybegynder
12. august 2005 - 13:45 #9
Ja, det er jo helt klart det pæneste, selv om det jo altså ikke er noget som stjæler vildt mange resourcer fra klientens PC:

    if (ds > 0)
    {
        // Vent 1000 milisekunder, altså 1 sekund, før at der tælles op igen.
        timeId = setTimeout('updateCounter();', 1000);
    }
Avatar billede -kenner- Nybegynder
12. august 2005 - 14:39 #10
Grunden til at jeg lagde det i kategorien PHP var at man ikke skal hente klokken og datoen fra klientens pc, men fra serveren, så nedtællingen er ens verden rundt.
Avatar billede roenving Novice
12. august 2005 - 14:51 #11
Hvis du vil sørge for at kompensere for de ofte flere sekunder brugernes pc'er er galt i tiden er det een linje php og en 3-4 linjers ekstra javascript ...

-- hvis det handler om at du vil hente den samme værdi ud, uanset hvilken tidszone folk befinder sig i, bruger du bare Date-objektets UTC-værdier, som altid vil give tidspunktet, som det er ifølge Universal Time ...

-- iøvrigt returnerer getTime netop den værdi, så det, det handler om, er at tilpasse værdien af dit oprettede objekt til UTC-tid, så udenfor funktionen gør du f.eks. sådan:

var d2 = new Date();
d2.setUTCFullYear(2005);
d2.setUTCMonth(7);
d2.setUTCDate(31);
d2.setUTCHours(12);
d2.setUTCMinutes(45);

-- så må du selv lige sørge for at omregne dit tidspunkt til UTC, før du sætter det ind i scriptet !-)
Avatar billede -kenner- Nybegynder
12. august 2005 - 14:53 #12
Nu kan jeg keine javascript, så jeg vil virkelig værdsætte en copy n' past kode.
Avatar billede roenving Novice
12. august 2005 - 15:09 #13
Download mit Date-udvidelses-script og placer det i samme bibliotek som siden, og brug følgende:

<script language="javascript" type="text/javascript" src="roenvingDate.js"></script>
<script language="javascript" type="text/javascript">
var endDate = new Date(0),intervalId;
endDate.setUTCFullYear(2005);
endDate.setUTCMonth(7);
endDate.setUTCDate(31);
endDate.setUTCHours(12);//UTC er ved sommertid 2 timer mindre, altså er dette kl. 14 i Danmark
endDate.setUTCMinutes(45);

window.onload = function(){
  updateTime();
  intervalId = setInterval("updateTime()",1000);
}
function updateTime(){
  var nu = new Date();
  var tid = document.getElementById("minSpan");
  if(nu.getTime() >= endDate.getTime()){
    tid.firstChild.nodeValue = "Tidspunktet er overskredet";
    if(intervalId)clearInterval(intervalId);
  }else
    tid.firstChild.nodeValue = endDate.age(0,0,6,1);
}
</script>

-- og stedet, det skrives (du kan selvfølgelig give span'en et mere sigende id, du skal bare huske at rette det i scriptet også !-)

<span id="minSpan">En span-tekst</span>
Avatar billede roenving Novice
12. august 2005 - 15:15 #14
Næh, den går nok ikke, for mit script bruger lokale variabler, så vi må nok grave den ud af hele scriptet, kigger lige på det !-)
Avatar billede roenving Novice
12. august 2005 - 15:16 #15
Jo, den er zq da god nok, for den gør det på begge tidspunkter, og så spiller det jo ingen trille, forskellen er jo ens !-)
Avatar billede -kenner- Nybegynder
12. august 2005 - 15:34 #16
Det ser godt ud ;)

- Send svar.
Avatar billede roenving Novice
12. august 2005 - 15:36 #17
Velbekomme '-)
Avatar billede roenving Novice
12. august 2005 - 15:54 #18
-- og tak for point ;~}
Avatar billede nielle Nybegynder
12. august 2005 - 16:13 #19
Der er altså et eller andet i logikken jeg ikke helt er enig i. "endDate" sættes til en absolut værdi, og "nu" sættes ud fra det lokale ur. Var det ikke meningen at "nu" skulle initialiseres med server-uret, og derefter tikke med det lokale ur, sådan at nedtællingen var den samme overalt.

Bortset fra at denne version er formateret lidt ud over blot at vise sekunder, så er den ikke væsentlig forskellig fra det jeg kom med? Men det er måske bare mig som ikke lige kan gennemske hemmeligheden?
Avatar billede roenving Novice
12. august 2005 - 16:15 #20
Date-objekter i javascript initialiseres altid i UTC !-)
Avatar billede nielle Nybegynder
12. august 2005 - 17:03 #21
Ja, det er da sikkert korrekt nok. Men hvad har det at gøre med hvordan serverens ur står? Og hvilken ekstern tidsserver er det der bruges hvis klientens ur står forkert?
Avatar billede roenving Novice
12. august 2005 - 17:17 #22
Øeh, whaddd ...

1. -kenner-s problem var, at han ville have, at en bruger i Moskva og i Los Angeles så det samme, og så er løsningen at initialisere med UTC-tid ...

2. De fleste nutidige styresystemer synkroniserer selv via en eller anden tids-server, så det vil være sjældent, der er mere end nogle få sekunder galt ...

3. Som skrevet i kommentaren @14:51:13, er det een linjes php og 3-4 linjers javascript til at registrere differencen og indregne den ...

4. Jeg forstår ikke at det kan være et kritikpunkt af min løsning, for den er jo heller ikke præsent i dit eksempel ...

5. Og jeg fulgte faktisk spændt med og ventede på, at du kom til det punkt, hvor selve spørgsmålets overskrift blev vigtig ...

-- iøvrigt skulle du lige tage og kigge på mit script, for når man får lært at bruge de nye Date-funktioner er resultatet noget no-nonsense scripting, som du også kan se på ovenstående script, hvor funktionen .age(0,0,6,1) direkte leverer en fornuftig tekststreng i f.eks. dette format:

1 måned, 18 dage, 12 timer, 1 minut, 23 sekunder

-- eller f.eks.

1 month, 18 days, 12 hours, 1 minute, 23 seconds

-- hvis man også inkluderer et engelsk sprogmodul !-)
Avatar billede -kenner- Nybegynder
13. august 2005 - 11:33 #23
Jeg vil lige hører om det kan lade sig gøre at få inkluderet et lille stykke tekst i forbindelse med .age(0,0,6,1) da den tekst ikke skal vises når tidpunktet er overskredet.

Det skal bare være: "Jeg tager afsted til U.S.A. om .age(0,0,6,1)"
Avatar billede nielle Nybegynder
13. august 2005 - 11:42 #24
'sgo:

function updateTime(){
    var nu = new Date();
    var tid = document.getElementById("minSpan");
    if(nu.getTime() >= endDate.getTime()){
        tid.firstChild.nodeValue = "Tidspunktet er overskredet";
        if(intervalId)clearInterval(intervalId);
    }else
        tid.firstChild.nodeValue = "Jeg tager afsted til U.S.A. om " + endDate.age(0,0,6,1);
}
Avatar billede rose23 Nybegynder
17. juni 2013 - 14:37 #25
Hej. HJÆLP jeg har brug for en nem nedtælling til dage og timer...
Avatar billede sonalias Seniormester
17. juni 2013 - 15:33 #26
Åben en ny tråd (hvis du ikke kan bruge ovenstående) da denne tråd er 8 år gammel... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester