<?php //-------------------------- // countdown function // Note: Unix timestamp limitations // Date range is from // the year 1970 to 2038 //--------------------------
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);
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 !-)
-- 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]
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); };
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.
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 !-)
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å !-)
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?
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?
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 !-)
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)"
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); }
Åben en ny tråd (hvis du ikke kan bruge ovenstående) da denne tråd er 8 år gammel... :)
Synes godt om
Ny brugerNybegynder
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.