Problem mit Uhrzeit/Datum
Andreas
- javascript
Hallo!
ich habe mir ein nette kleines Javascript zusammen geschustert, welches mit Hilfe von DHTML auf einer Seite einen Countdown anzeigt, halt laufend mit Sekunden. Klappt grundsätzlich auch ganz gut, aber irgendwie komme ich mit den Daten nicht richtig klar. Zum einen ist die Uhr immer um eine Stunde verschoben,(wird was mit Winterzeit zu tun haben, denn bei gmt waren es glaub ich 2)
2. Problem, ich rechne die Differenz zwischen einem Datum in der Zukunft und dem aktuellen Datum aus, nur wenn ich die Differenz jetzt anzeige, bekomme ich z.B. für Jahr 1970(ich weiß, allg. Startdatum..., aber warum bei der Differenz???)
und auch Monate und Tage werden nicht richtig angezeigt.
Als Vorlage diente mir ein SELFHTML Scipt, das aber dei aktuelle Uhr wiedergibt.
Mein Code sieht wie Folgt aus:
<html><head><title>Test</title>
<script type="text/javascript" src="dhtml.js"></script>
<script type="text/javascript">
<!--
function toSt(n) {
s=""
if(n<10) s+="0"
return s+n.toString();
}
function ZeitAnzeigen() {
var Zeit = new Date();
var Zeit2 = new Date(2002,0,15,2,0,0);
var AbsolutJetzt = Zeit.getTime();
var AbsolutDann = Zeit2.getTime();
var Diff = AbsolutDann - AbsolutJetzt;
Zeit.setTime(Diff);
var Jahr = Zeit.getYear();
if(Jahr < 999) Jahr += 1900;
var Monat = toSt(Zeit.getMonth() + 1);
var Tag = Zeit.getDate();
var Stunden = Zeit.getHours();
var Minuten = toSt(Zeit.getMinutes());
var Sekunden = toSt(Zeit.getSeconds());
var Uhrzeit = Tag + "." + Monat + "." + Jahr + " - " + Stunden + ":" + Minuten + ":" + Sekunden;
if(DHTML) {
if(NS) setCont("id","Uhr",null,"<span class="Uhr">" + Uhrzeit + "</span>");
else setCont("id","Uhr",null,Uhrzeit);
}
else return;
window.setTimeout("ZeitAnzeigen()",1000);
}
//-->
</script>
<style type="text/css">
<!--
#Uhr { position:absolute; top:10px; left:10px; }
#RestDerSeite { position:absolute; top:50px; left:10px; }
.Uhr { font-family:Arial; font-size:24px; color:blue; }
.RestDerSeite { font-family:Arial; color:black; }
-->
</style>
</head>
<body onLoad="window.setTimeout('ZeitAnzeigen()',1000)">
<div id="Uhr" class="Uhr"> </div>
<div id="RestDerSeite" class="RestDerSeite">
<h1>Willkommen auf dieser Seite</h1>
<p>hier gehts ganz normal weiter</p>
</div>
</body></html>
Code der dhtml.js(hab ich kpl. übernommen):
<link: http://selfhtml.teamone.de/dhtml/beispiele/anzeige/dhtml.htm]
Jedenfalls erhalte ich jetzt(1:04 Uhr) so Anzeigen wie:
2.01.1970 - 1:55:23
Die Uhrzeit stimmt bis auf eine Stunde, nur das kpl. Datum spinnt irgendwie!
Ich bin leider kein Javascript Experte, war schon froh als überhaupt ein Countdown angezeigt wurde ;-)
Ist wahrscheinlich nichts kompliziertes und ganz offensichtlich, naja, für mich leider nicht!
Grüsse
Andreas
Hallo,
(es ist schon spät, ich bin müde, bitte Fehler verzeihen:)
var Zeit2 = new Date(2002,0,15,2,0,0);
Um die Stunde zu korrigieren, diese beim 4. Parameter (hier:"2") ändern. Warum die 1 Stunde differenz? Noch keine Ahnung.
var Uhrzeit = Tag + "." + Monat + "." + Jahr + " - " + Stunden + ":" + Minuten + ":" + Sekunden;
Um das 1970 zu ändern, "Jahr" durch "(Jahr-1970)" ersetzen.
Jedenfalls erhalte ich jetzt(1:04 Uhr) so Anzeigen wie:
2.01.1970 - 1:55:23
Die Uhrzeit stimmt bis auf eine Stunde, nur das kpl. Datum spinnt irgendwie!
Von Tag und Monat auch je 1 abziehen (0 Differenz --> Anzeige 1.1.).
Gute Nacht für heute
Frank
Hallo auch!
(es ist schon spät, ich bin müde, bitte Fehler verzeihen:)
;-)
var Zeit2 = new Date(2002,0,15,2,0,0);
Um die Stunde zu korrigieren, diese beim 4. Parameter (hier:"2") ändern. Warum die 1 Stunde differenz? Noch keine Ahnung.
Ich nur ein Beispiel, damit ich "wenigstens theoretisch" einen Zeitpunkt in der Zukunft habe!
var Uhrzeit = Tag + "." + Monat + "." + Jahr + " - " + Stunden + ":" + Minuten + ":" + Sekunden;
Um das 1970 zu ändern, "Jahr" durch "(Jahr-1970)" ersetzen.
Gut, aber da verstehe ich nicht, warum da überhaupt sowas steht, man muß das doch hinbekommen, dass die Differenz 0 Jahre sind, und man die Werte alle aus dieser Diferenz bekommt!
Jedenfalls erhalte ich jetzt(1:04 Uhr) so Anzeigen wie:
2.01.1970 - 1:55:23
Die Uhrzeit stimmt bis auf eine Stunde, nur das kpl. Datum spinnt irgendwie!
Von Tag und Monat auch je 1 abziehen (0 Differenz --> Anzeige 1.1.).
Genau dasselbe wie oben, nur mit der Zeit bekomme ich womöglich noch Probleme mit Sommer/Winterzeit, wenn ich das so mache. Ich würde die Differenz gerne verstehen! Die sollte nämlich gar nicht da sein, alles in allem nur en paar Minuten Differenz, den Daten nach die ich vorgegeben habe!
Grüsse
Andreas
Moin!
var Zeit = new Date();
var Zeit2 = new Date(2002,0,15,2,0,0);
var AbsolutJetzt = Zeit.getTime();
var AbsolutDann = Zeit2.getTime();
var Diff = AbsolutDann - AbsolutJetzt;
Bis hierher alles klar. Offenbar verstehst Du, dass getTime() den Wert des Datums als Sekunden seit 1970 zurueckgibt. Aber dann:
Zeit.setTime(Diff);
Warum? Das ist die Umkehrung von getTime(). D.h. Du setzt ein DATUM, nicht etwa eine Zeitdifferenz. Dadurch, dass die Sekunden ja seit 1970 gelten, erklaert sich Deine seltsame Ausgabe.
var Jahr = Zeit.getYear();
if(Jahr < 999) Jahr += 1900;
Nimm einfach getFullYear().
var Stunden = Zeit.getHours();
getHours gibt die Stunden in was zurueck? In der Lokalzeit. Die Sekunden seit 1970 gelten aber in UTC, also britische Zeit (im Winter). Der sind wir hier aber um 1 Stunde voraus, im Sommer sogar 2 Stunden. Daher dann also Deine abweichende Zeitangabe. Schau Dir getUTCHours() an.
Aber: Welches Ergebnis erwartest Du eigentlich bei der Umrechnung? Nehmen wir an, Du hast eine Differenz von
365*24*3600 sec = 31536000 sec. Wieviel ist das umgerechnet? Ein Jahr? Aber wenn heute der 1.1.2004 ist, dann hat das Jahr 366 Tage, die Sekundenanzahl gibt aber nur 1 Tag weniger her. Was willst Du tun? Durch die exakte Zahl der Sekunden eines Jahres, naemlich 365.2422*24*3600 dividieren? Das waere theoretisch richtiger, bringt aber erst recht nicht die erwarteten Resultate. (Z.B. wird die Diff. zw. 1.1.2004 und 1.1.2005 als 1.002074787634 Jahre = 1 Jahr, 18 h, 11 min, 13.9 sec errechnet, die zwischen 1.1.2003 und 1.1.2004 aber nur als 0.9993368783782 Jahre = 365 Tage, also 5 h, 48 min, 46 sec weniger als 1 Jahr. (Rechne einfach mal nach mit 1 Jahr = 365.2422 Tage.))
Hast Du darueber schonmal nachgedacht? Komm, sei ehrlich. ;-) Ich weiss jedenfalls nicht, wie man es korrekt macht.
So long
Hi!
Irgendwie hatte ich mir das ganze doch einfacher vorgestell;-)
Bis hierher alles klar. Offenbar verstehst Du, dass getTime() den Wert des Datums als Sekunden seit 1970 zurueckgibt. Aber dann:
Zeit.setTime(Diff);
Warum? Das ist die Umkehrung von getTime(). D.h. Du setzt ein DATUM, nicht etwa eine Zeitdifferenz. Dadurch, dass die Sekunden ja seit 1970 gelten, erklaert sich Deine seltsame Ausgabe.
Ich kann das einfach nicht verstehen! Ich muß doch irgendwie die Differenz ausrechnen können(das sollte ich doch wenigstens geschafft haben!), daraus dann die Anzahl an Sekunden, Minuten, Stunden und Tagen bekommen, oder??? Ganz unabhängig von irgendeinem Datum oder so!
var Jahr = Zeit.getYear();
if(Jahr < 999) Jahr += 1900;
Nimm einfach getFullYear().
Aber das geht erst ab IE 5.0!
var Stunden = Zeit.getHours();
getHours gibt die Stunden in was zurueck? In der Lokalzeit. Die Sekunden seit 1970 gelten aber in UTC, also britische Zeit (im Winter). Der sind wir hier aber um 1 Stunde voraus, im Sommer sogar 2 Stunden. Daher dann also Deine abweichende Zeitangabe. Schau Dir getUTCHours() an.
Wieder die Sache mit IE5.0! Aber ich verstehe die Notwendigkeit auch nicht, da ich ja lediglich eine _Differenz_ ausrechnen will, sch... egal in welcher Zeitzone, solange Subtrahent und Minuent (ohhh!) sich auf die gleiche Zone beziehen!
Aber: Welches Ergebnis erwartest Du eigentlich bei der Umrechnung? Nehmen wir an, Du hast eine Differenz von
365*24*3600 sec = 31536000 sec. Wieviel ist das umgerechnet? Ein Jahr? Aber wenn heute der 1.1.2004 ist, dann hat das Jahr 366 Tage, die Sekundenanzahl gibt aber nur 1 Tag weniger her. Was willst Du tun? Durch die exakte Zahl der Sekunden eines Jahres, naemlich 365.2422*24*3600 dividieren? Das waere theoretisch richtiger, bringt aber erst recht nicht die erwarteten Resultate. (Z.B. wird die Diff. zw. 1.1.2004 und 1.1.2005 als 1.002074787634 Jahre = 1 Jahr, 18 h, 11 min, 13.9 sec errechnet, die zwischen 1.1.2003 und 1.1.2004 aber nur als 0.9993368783782 Jahre = 365 Tage, also 5 h, 48 min, 46 sec weniger als 1 Jahr. (Rechne einfach mal nach mit 1 Jahr = 365.2422 Tage.))
Hast Du darueber schonmal nachgedacht? Komm, sei ehrlich. ;-) Ich weiss jedenfalls nicht, wie man es korrekt macht.
Da brauch ich nicht drüber nachzudenken, da ich wie gesagt eine Differenz ausrechnen will!
Ich will die Tage.... eine Differenz bekommen, oder muß ich das zu Fuß machen(also Diff ind Millosekunden /1000, und... alles einzelnd azusrechnen)? Aber da weiß ich auch nicht genau, wie ich das machen soll!
Danke für deine Hilfe schonmal, jetzt versteh ich das schon etwas besser, nur leider noch nicht gut genug;-)
Grüsse
Andreas
Re!
Da brauch ich nicht drüber nachzudenken, da ich wie gesagt eine Differenz ausrechnen will!
[...]
Danke für deine Hilfe schonmal, jetzt versteh ich das schon etwas besser, nur leider noch nicht gut genug;-)
Nein, Du hast es komplett ueberhaupt nicht verstanden. Lies es noch mal durch und denk in Ruhe drueber nach. Das, was ich geschrieben habe, spielt alles, NACHDEM Du die Differenz in Sekunden schon ausgerechnet hast.
Der Fehler in Deinem anderen Posting: Bei
if(Tag=0) {var Tage = " ";}
if(Tag=1) {var Tage = " " + Tag +" Tag";}
musst Du == bei der Bedingung verwenden. Ein einfaches = ist eine Zuweisung, und die wird dann auch gemacht.
So long
Hi nochmal!
Also ich hab noch ein bisschen rumprobiert, hab das jetzt "zu Fuß" ausgerechnet, geht wunderbar. Jetzt habe ich aber auch einmal Probleme mit If-Abfragen, das ganze sieht jetzt so aus:
var Zeit = new Date();
var Zeit2 = new Date(2002,0,14,12,0,0);
var AbsolutJetzt = Zeit.getTime();
var AbsolutDann = Zeit2.getTime();
var count = Math.floor((AbsolutDann - AbsolutJetzt)/1000);
var Sekunde=toSt(count%60);
count=Math.floor(count/60);
var Minute=toSt(count%60);
count=Math.floor(count/60);
var Stunde=toSt(count%24);
count=Math.floor(count/24);
var Tag=count;
if(Tag=0) {var Tage = " ";}
if(Tag=1) {var Tage = " " + Tag +" Tag";}
if(Tag>1) {var Tage = " " + Tag +" Tage";}
var Uhrzeit =Tage + " ," + Stunde + ":" + Minute + ":" + Sekunde;
Problem ist, dass er automatisch ohne zu "überlegen" immer Tag = 1 annimmt, obwohl Tag oben den Wet 0 hat. Was ist daran falsch? Gibts bei javasript irgendwelche besonderheiten bei IF-Abfragen?
Grüsse
Andreas
Hallo Andreas!
Hab mir das mal angesehen und mit folgendem Skript kannst Du zwischen zwei beliebigen Zeitpunkten die Differenz in Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden berechnen:
<script language="Javascript">
function ZeitBerechnen() {
var StartZeit = new Date();
var StartJahr = StartZeit.getFullYear();
var StartMonat = StartZeit.getMonth();
var StartTag = StartZeit.getDate();
var StartStunde = StartZeit.getHours();
var StartMinute = StartZeit.getMinutes();
var StartSekunde = StartZeit.getSeconds();
var EndZeit = new Date(2010,0,15,2,0,0); //15.1.2010 um 2:00:00 Uhr
var EndJahr = EndZeit.getFullYear();
var EndMonat = EndZeit.getMonth();
var EndTag = EndZeit.getDate();
var AbsolutStart = StartZeit.getTime();
var AbsolutEnd = EndZeit.getTime();
var Diff = AbsolutEnd - AbsolutStart;
if (!(Diff>0))
{
msgbox("Der angegebene Zeitpunkt liegt in der Vergangenheit!");
return;
}
var AnzahlJahre = EndJahr - StartJahr;
var AnzahlMonate = EndMonat - StartMonat;
if (EndMonat < StartMonat)
{
AnzahlJahre -= 1; AnzahlMonate = 12 + AnzahlMonate;
}
var AnzahlTage = 0;
if (EndTag < StartTag)
{
if (AnzahlMonate == 0)
{
AnzahlMonate = 11;
AnzahlJahre -= 1;
}
else AnzahlMonate -= 1;
var Jahr = (EndMonat == 0) ? EndJahr -1: EndJahr;
var Datum = new Date();
for (var Tag=StartTag+1; Tag < 32; Tag++)
{
Datum.setDate(Jahr,EndMonat-1,Tag,StartStunde,StartMinute,StartSekunde);
if (Datum.getMonth == EndMonat) break;
AnzahlTage += 1;
}
AnzahlTage += EndTag;
}
else
AnzahlTage = EndTag - StartTag;
var Datum = new Date(EndJahr,EndMonat,EndTag,StartStunde,StartMinute,StartSekunde);
var AbsolutDatum = Datum.getTime();
var Diff2 = (AbsolutEnd - AbsolutDatum)/1000;
Diff2 = (Diff2 < 0) ? Diff2 + 24*60*60 : Diff2;
var AnzahlStunden = Math.floor(Diff2/(60*60));
Diff2 = Diff2 % (60*60);
var AnzahlMinuten = Math.floor(Diff2/60);
var AnzahlSekunden = Diff2 % 60;
alert(AnzahlJahre + " Jahre, " + AnzahlMonate + " Monate, " + AnzahlTage + " Tage\n"+AnzahlStunden + " Stunden, " + AnzahlMinuten + " Minuten, " + AnzahlSekunden + " Sekunden");
}
ZeitBerechnen ();
</script>
Hat bei allen möglichen Datumsangaben funktioniert.
lg
Christian
Hi!
Danke dir, hab ein paar sachen von dir noch eingebaut, jetzt läuft es prima!
Grüsse
Andreas
Hi!
Sorry, aber eine Stelle gehört noch umgebessert:
var Jahr = (EndMonat == 0) ? EndJahr -1: EndJahr;
var Datum = new Date(Jahr,EndMonat-1,StartTag,StartStunde,StartMinute,StartSekunde);
for (var Tag=StartTag+1; Tag < 32; Tag++)
{
Datum.setDate(Tag);
if (Datum.getMonth == EndMonat) break;
AnzahlTage += 1;
}
AnzahlTage += EndTag;
}
Jetzt sollte es einwandfrei klappen.
lg
Christian