jspit
Lounge-Member
Wieviel Tage sind es noch bis zum Ereignis (Event, Sylvester, Geburtstag), das Alter berechnen oder die verangenen Stunden ab einen bestimmten Zeitpunkt, all diese Fragestellungen laufen auf die Berechnung von Datums- und Zeitdifferenzen hinaus. Unzählige Scripte sind hierzu im Netz vorhanden, doch leider sind auch viele fehlerhaft oder arbeiten nur für ein spezielles Beispiel richtig.
Zwei häufig anzutreffende Fehler seien hier nur genannt:
- Die Existenz einer Sommerzeit wird schlichtweg ignoriert. Der Tag hat ja immer 24 Stunden - falsch. Am Tag der Umstellung auf die Sommerzeit eben nur 23 Stunden, im Herbst gibt es einen Tag mit 25 Stunden. Dies kann zur Folge haben, dass die Berechnung einer Anzahl Tage über einen Umstellungszeitpunkt hinweg falsch wird.
- Bei der Berechnung des Alters werden einfach die Jahreszahlen subtrahiert und nicht berücksichtigt, ob der Kanidat zum aktuellen Zeitpunkt im Jahr schon Geburtstag hatte (und damit ein Jahr älter ist) oder nicht.
Es wird hier eine Funktion zur Diskussion gestellt, die wenig Code umfasst, schnell und transparent ist und für viele Problemstellungen obiger Art nutzbar ist. Alternative Datentypen string und date-object für die Parameter ermöglichen eine flexible Handhabung. Als Zeitintervall für den Rückgabewert werden akzeptiert:
- Millisekunden ('ms')
- Sekunden ('s')
- Minuten ('m')
- Stunden ('h')
- Tage ('d')
- Wochen ('w')
- Jahre ('y')
Als string wird ein Datum neben der normgerechten Form "Feb 1,2010 00:00:00" auch im Format "2010/2/1 00:00:00" von allen modernen Browsern richtig interpretiert, nicht jedoch deutsche Formate wie "1.2.2010".
Ein leerer String ("") ist gleichbedeutend mit dem aktuellen Datum/Zeit. Die Funktion DateDiff liefert mit der Ausnahme Jahre ("y") Dezimalzahlen. Werden ganze Zahlen gewünscht, ist Math.ceil() bzw. Math.floor() zu benutzten.
Eine Zeit kann auch als Datumsobjekt übergeben werden, wie im Beispiel Zeitmessung gezeigt wird. Die Genauigkeit einer Zeitmessung im ms-Bereich wird durch die Auflösung des internen Timers begrenzt und ist vom Browser und System abhängig. Die von der DateDiff-Funktion benötigte Zeit ist dagegen vernachlässigbar.
Eine Differenz in Jahren wird immer als ganze Zahl geliefert, da hier eine Dezimalzahl wenig Sinn macht. Die Berechnung unterliegt im script einer Ausnahmebehandlung und wurde integriert, da dies oft benötigt wird.
Nun zum Schluss darf der Code der function DateDiff nicht fehlen:
Getestet mit FF3.5, IE8, Chrome 3.
jspit
Zwei häufig anzutreffende Fehler seien hier nur genannt:
- Die Existenz einer Sommerzeit wird schlichtweg ignoriert. Der Tag hat ja immer 24 Stunden - falsch. Am Tag der Umstellung auf die Sommerzeit eben nur 23 Stunden, im Herbst gibt es einen Tag mit 25 Stunden. Dies kann zur Folge haben, dass die Berechnung einer Anzahl Tage über einen Umstellungszeitpunkt hinweg falsch wird.
- Bei der Berechnung des Alters werden einfach die Jahreszahlen subtrahiert und nicht berücksichtigt, ob der Kanidat zum aktuellen Zeitpunkt im Jahr schon Geburtstag hatte (und damit ein Jahr älter ist) oder nicht.
Es wird hier eine Funktion zur Diskussion gestellt, die wenig Code umfasst, schnell und transparent ist und für viele Problemstellungen obiger Art nutzbar ist. Alternative Datentypen string und date-object für die Parameter ermöglichen eine flexible Handhabung. Als Zeitintervall für den Rückgabewert werden akzeptiert:
- Millisekunden ('ms')
- Sekunden ('s')
- Minuten ('m')
- Stunden ('h')
- Tage ('d')
- Wochen ('w')
- Jahre ('y')
Als string wird ein Datum neben der normgerechten Form "Feb 1,2010 00:00:00" auch im Format "2010/2/1 00:00:00" von allen modernen Browsern richtig interpretiert, nicht jedoch deutsche Formate wie "1.2.2010".
PHP:
//Beispiel: Anzahl der Tage Februar 2000
var Anzahl = DateDiff("2000/2/1","2000/3/1","d");
PHP:
//Beispiel: Anzahl der Tage bis zum neuen Jahr 2011
var Anzahl = Math.ceil(DateDiff("","2011/1/1","d"));
//Anzahl Stunden bis zum neuen Jahr
var newyear=(new Date()).getFullYear() + 1; //immer das neue Jahr
Anzahl = Math.ceil(DateDiff("",newyear + "/1/1","h"));
PHP:
//Beispiel: Zeitmessung für ein Script
var Startzeit= new Date();
//Hier folgt der Script
// :
//
var zeit=DateDiff(Startzeit,"","ms");
PHP:
//Beispiel: Jahre der Zugehörigkeit zum Forum seit Registrierung 17-03-2008
var Anzahl = DateDiff("2008/3/17","","y");
Nun zum Schluss darf der Code der function DateDiff nicht fehlen:
PHP:
<script type="text/javascript">
function DateDiff(dfrom,dto,selector){
//dfrom: Startdatum als String, "" für das aktuelle Datum/Zeit oder Date-Object
//dto: Enddatum als String, "" für das aktuelle Datum/Zeit oder Date-Object
//selctor: 'ms' Millisekunden, 's' Sekunden, 'm' Minuten, 'h' Stunden,
// 'd' tage, 'w' wochen, 'y' ganze Jahre
var r,dfy,dy;
var osl = {ms:1,s:1000,m:60000,h:3600000,d:86400000,w:604800000,y:-1};
var df = typeof(dfrom)=="object" ? dfrom : dfrom=="" ? new Date() : new Date(dfrom);
var dt = typeof(dto)=="object" ? dto : dto=="" ? new Date() : new Date(dto);
var sl = osl[selector] || 1;
var sz= sl >= osl['d'] ? (df.getTimezoneOffset()-dt.getTimezoneOffset())*60000 : 0;
if(sl > 0) return (dt.getTime() - df.getTime() +sz)/sl;
else { dfy = df.getFullYear();
dy = dt.getFullYear() - dfy;
dt.setFullYear(dfy);
return (dt.getTime() < df.getTime()) ? dy -1 : dy; }
}
</script>
Getestet mit FF3.5, IE8, Chrome 3.
jspit