Archivlink: javarea.de Forum > JavaScript > countdown mit timestamp als zieldatum
Vollständigen Link anzeigen: javarea.de Forum > JavaScript > countdown mit timestamp als zieldatum
Pages: [1]
| geschrieben von Dasjo am 16.11.2005 - 13:41 |
Hallo Leute,
da ich mit Javascript relativ unerfahren bin, hab ich mir von einem Kumpel ein Countdown Script schicken lassen. Ich hab das so weit umgemodelt wie ich es brauchte...
Zur Vorgeschichte. Ich programmiere grade ein Browsergame. Wenn jemand etwas baut, wird der Timestamp der fertigstellung errechnet und in eine Datenbank eingetragen. Nun wird der timestamp zerlegt (siehe skript unten) und als zieldatum gesetzt. Problem bei der ganzen geschichte ist, nehmen wir an der countdown soll 12 minuten runterzählen. Er startet aber bei 11 Minuten und 40 Sekunden. WARUM ist das so? gibt es probleme zwischen dem Startdatum und dem Enddatum? Desto größer die Bauzeit, desto größer ist auch die Differenz des countdowns.
Ich würde mich freuen wenn sich jemand kurz die zeit nimmt, und das script mal durchfliegt. Danke, gruß, jo
| PHP-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
|
<?php
//$bautime wäre in diesem fall ein timestamp, der festlegt wann das gebäude fertig ist
$timestamp = time();
$jahr = date("Y", $bautime);
$monat = date("m", $bautime);
$tag = date("d", $bautime);
$stunde = date("H", $bautime);
$minute = date("i", $bautime);
$sekunde = date("s", $bautime);
$test= date("Y,m,d,H,i,s", $timestamp);
?>
<script language="JavaScript">
// Ziel-Datum in MEZ
var jahr=<? echo $jahr ?> ,
monat=<? echo $monat ?>,
tag=<? echo $tag ?>,
stunde=<? echo $stunde ?>,
minute=<? echo $minute ?>,
sekunde=<? echo $sekunde ?>;
var zielDatum=new Date(jahr,monat-1,tag,stunde,minute,sekunde);
function countdown() {
startDatum=new Date(); // Aktuelles Datum
// Countdown berechnen und anzeigen, bis Ziel-Datum erreicht ist
if(startDatum<=zielDatum) {
var jahre=0, monate=0, tage=0, stunden=0, minuten=0, sekunden=0;
/* Allgemeines Vorgehen:
* Zunächst werden die vollen Jahre gezählt
* und anschließend der Start- und Ziel-Monat auf den jeweiligen 1. gesetzt.
* Nun werden erst die vollen Monate vom 1. zum 1. des Start- bzw. Ziel-Monats
* berechnet und danach die tatsächlichen Monatstage wieder mit einbezogen.
* Dieses Vorgehen vermeidet Probleme mit den verschiedenen Monatslängen.
* Was übrig bleibt, wird in Tagen, Stunden, Minuten und Sekunden ausgedrückt.*/
// Jahre
if(startDatum<zielDatum) {
while(startDatum<zielDatum) {
if(startDatum.setFullYear(startDatum.getFullYear()+1)<=zielDatum) jahre++;
}
startDatum.setFullYear(startDatum.getFullYear()-1);
}
// Restliche Tage zum Monatsende ermitteln
var restTage=0;
var m=startDatum.getMonth();
if(m==1-1|| m==3-1||m==5-1||m==7-1||m==8-1||m==10-1||m==12-1)
restTage=31-startDatum.getDate();
else if(m==4-1|| m==6-1||m==9-1||m==11-1) restTage=30-startDatum.getDate();
else if(m==2-1) {
if(startDatum.getFullYear()%4==0 && (startDatum.getFullYear()%100!=0
|| startDatum.getFullYear()%400==0))
restTage=29-startDatum.getDate(); // Schaltjahr
else restTage=28-startDatum.getDate();
}
// Start- und Ziel-Tag merken und auf 1 setzen
var startTag=startDatum.getDate();
var zielTag=zielDatum.getDate();
startDatum.setDate(1);
zielDatum.setDate(1);
// Monate
if(startDatum<zielDatum) {
while(startDatum<zielDatum) {
if(startDatum.setMonth(startDatum.getMonth()+1)<=zielDatum) monate++;
}
startDatum.setMonth(startDatum.getMonth()-1);
}
// Tatsächlichen Start- und Ziel-Tag berücksichtigen
if(startDatum.getMonth()==zielDatum.getMonth()) {
if(startTag<=zielTag) startDatum.setDate(startTag);
else {
monate--;
tage=restTage+1;
}
}
else {
startDatum.setMonth(startDatum.getMonth()+1);
if(startTag>=zielTag) tage=restTage+1;
else {
monate++;
startDatum.setDate(startTag);
}
}
zielDatum.setDate(zielTag);
// Tage
restTage=Math.floor((zielDatum-startDatum)/(24*60*60*1000));
startDatum.setTime(startDatum.getTime()+restTage*24*60*60*1000);
tage+=restTage;
// Stunden
stunden=Math.floor((zielDatum-startDatum)/(60*60*1000));
startDatum.setTime(startDatum.getTime()+stunden*60*60*1000);
// Minuten
minuten=Math.floor((zielDatum-startDatum)/(60*1000));
startDatum.setTime(startDatum.getTime()+minuten*60*1000);
// Sekunden
sekunden=Math.floor((zielDatum-startDatum)/1000);
// Anzeige formatieren
(stunden!=1)?stunden=stunden+":":stunden=stunden+":";
if(minuten<10) minuten="0"+minuten;
(minuten!=1)?minuten=minuten+":":minuten=minuten+":";
if(sekunden<10) sekunden="0"+sekunden;
(sekunden!=1)?sekunden=sekunden+"":sekunden=sekunden+"";
document.countdownform.countdowninput.value=
jahre+monate+tage+stunden+minuten+sekunden;
setTimeout('countdown()',1000);
}
// Anderenfalls alles auf Null setzen
else document.countdownform.countdowninput.value=
"Abgeschlossen";
}
</script>
|
|
| geschrieben von Patrick am 20.11.2005 - 08:34 |
Servus,
es wäre sehr hilfreich, wenn du auch schreibst, welcher Fehler auftritt :-))
Oder sollen wir das Seript einfach nur überfliegen und optimieren???
Gruß,
Patrick |
| geschrieben von René am 20.11.2005 - 10:12 |
| Zitat | | | Original geschrieben von Dasjo am 16.11.2005 - 13:41
Er startet aber bei 11 Minuten und 40 Sekunden. WARUM ist das so? |
Der Grund ist folgender der Timestamp von PHP kommt vom Server auf dem das Script liegt.
Das startDatum=new Date(); // Aktuelles Datum ist die Zeit auf dem Rechner des Besuchers.
Sind beide, Server und Uhr auf dem Rechner des Besuchers, nicht Synchron kommt es eben zu dieser Zeitdiverenz. Es kann aber auch sein das es wie in deinem Beispiel oben 20 Sekunden dauert bis die Seite im Browser des Besuchers geladen ist.
Außerdem hätte der Besucher hier schon die Möglichkeit die Zeit zu manipulieren er stellt seine Zeit auf seinem Rechner mit Absicht falsch ein. Ist die Zeit fast abgelaufen dreht er seine Uhr wieder zurück z.B. gleich mal 3 Stunden dann hat er nicht nur 12 Minuten Zeit sondern 3 Stunden.
|
| geschrieben von Patrick am 20.11.2005 - 10:43 |
Da hat wohl einer Tomaten auf den Augen gehabt 
Misst.... Sorry, habs überlesen |
| geschrieben von Dasjo am 21.11.2005 - 18:04 |
so was ähnliches hab ich schon vermutet, wollte aber ne bestätigung. danke erstmal dass ihr geantwortet habt.
es wäre super wenn einer von euch ne idee hätte wie ich das lösen könnte, bzw das startdatum auch vom server zu beziehen, ich kenne mich wie gesagt mit java nicht wirklich aus. hoffe sehnlichst auf antwort...
gruß, Jo |
| geschrieben von Patrick am 21.11.2005 - 18:26 |
Wenn du dir das Datum mit PHP ziehst, müsste normalerweise das ServerDatum genutzt werden. Hier findest du die entsprechende Info http://de2.php.net/manual/de/function.date.php
Falls du Hilfe bei der Implementierung benötigst, melde diche infach nochmal.
Gruß,
Patrick |
| geschrieben von Dasjo am 21.11.2005 - 18:47 |
ich hab jetzt das startdatum in php konvertiert.
Hier ist der Anfang des Skriptes:
<?php
$timestamp = time();
$jahrnow = date("Y", $timestamp);
$monatnow = date("m", $timestamp);
$tagnow = date("d", $timestamp);
$stundenow = date("H", $timestamp);
$minutenow = date("i", $timestamp);
$sekundenow = date("s", $timestamp);
$jahr = date("Y", $bautime);
$monat = date("m", $bautime);
$tag = date("d", $bautime);
$stunde = date("H", $bautime);
$minute = date("i", $bautime);
$sekunde = date("s", $bautime);
$test= date("Y,m,d,H,i,s", $timestamp);
?>
<script language="JavaScript">
// Ziel-Datum in MEZ
var jahr=<? echo $jahr ?>,
monat=<? echo $monat ?>,
tag=<? echo $tag ?>,
stunde=<? echo $stunde ?>,
minute=<? echo $minute ?>,
sekunde=<? echo $sekunde ?>;
var jahrnow=<? echo $jahrnow ?>,
monatnow=<? echo $monatnow ?>,
tagnow=<? echo $tagnow ?>,
stundenow=<? echo $stundenow ?>,
minutenow=<? echo $minutenow ?>,
sekundenow=<? echo $sekundenow ?>;
var zielDatum=new Date(jahr,monat-1,tag,stunde,minute,sekunde);
function countdown() {
startDatum=new Date(jahrnow,monatnow-1,tagnow,stundenow,minutenow,sekundenow); // Aktuelles Datum
------------------------------------------------------
alles andere ist gleich geblieben. Nun wird die richtige Zeit angezeigt, aber der countdown zählt nicht mehr, d.h. er bleibt einfach stehen und zeigt nun den aktuellen zeitabstand an. :/ wenn ich das startdatum wieder = new Date(); setze, läuft er wieder, zeigt aber wieder die falsche zeit an?!
|
| geschrieben von Patrick am 22.11.2005 - 08:46 |
Servus,
muha, dass ist natürlich scheisse...
Sitze grad auf der Arbeit und habe leider keine Zeit...
Melde mich entweder heute Abend nochmal oder helfe dir morgen bei der Lösungsfindung...
Evtl. füllst du einfach nur dein startDatum mit php
startDatum = <?=$aktDatum?>
Dazu musst du nur im PHP mit dem AktDatum immer die aktuelle Zeit ermitteln, sollte aber nicht das größte problem sein....
Gruß,
Patrick |
| geschrieben von Dasjo am 22.11.2005 - 12:20 |
ja soweit hab ich mir das auch schon überlegt. nur in welchem format muss die aktuelle zeit in php stehen? ich hab folgendes probiert:
$aktdatum = "$jahrnow$monatnow$tagnow$stundenow$minutenow$sekundenow";
(Ausgeschrieben z.B: 20051022121357)
Ergebniss: Countdown ist bereits abgelaufen, obwohl er noch einige Stunden laufen müsste)
$aktdatum = "$jahrnow,$monatnow,$tagnow,$stundenow,$minutenow,$sekundenow";
(Ausgeschrieben z.B: 2005,10,22,12,13,57)
Ergebniss: Countdown wird nicht angezeigt)
Implementierung sah natürlich so aus:
startDatum=<?=$aktdatum?> // Aktuelles Datum
Bin langsam echt verzweifelt. kanns sein dass meine obige lösung bei der der Countdown stehen blieb daran liegt, dass das startdatum nach seiner Definition zum Berechnen verschiedener Werte herangezogen wird? (siehe skript im ersten beitrag)
hänge mal die datei an mit der ich gerade arbeite (bitte nach dem runterladen wieder in php umbenennen sofern dus ausprobieren willst) |
| geschrieben von Dasjo am 22.11.2005 - 22:26 |
hat denn niemand eine ahnung?!  |
| geschrieben von Patrick am 25.11.2005 - 23:45 |
Sers,
in dem Script muss irgendwo der Wurm drin sein...
Also ich habe jetzt verschiedene Dinge getestet und nichts funktioniert....
Muss das Script nochmal komplett auseinander nehmen 
Wird allerdings erst nächste Woche.
Falls du jetzt oder bis dahin schon eine Lösung hast, wäre es nett, wenn du diese Postest.
Gruß,
Patrick |
|