Systemvoraussetzung
- Linux
- Windows
- PHP 3
- PHP 4
- PHP 5
Datei(en)
verstrichene_zeit.php
Problem
Sie haben zwei Datumsangaben im TimestampFormat
(Sekunden) und möchten
die Anzahl der Tage, Stunden, Minuten und Sekunden ermitteln, die zwischen
diesen Datumsangaben liegen. Mögliche Fragen, die diese Problemstellung
umschreiben, wären beispielsweise:
- Wann beginnt das Eröffnungsspiel der WM 2006?
- Wann war ein Besucher das letzte Mal online?
- In wie vielen Tagen läuft ein AuktionsAngebot
aus?
Lösung
Bei dieser Lösung handelt es sich um eine rein mathematische Aufgabe. Bevor
Sie sich die Lösung anschauen, versuchen Sie sich doch einmal selbst und
berechnen Sie die Minuten und Sekunden für folgendes Beispiel:
67 Sekunden sind: ? Minuten, ? Sekunden
Sie werden sicherlich sagen: „Logisch, das sind eine Minute und 7 Sekunden!“.
Damit haben Sie natürlich Recht – aber haben Sie das Ergebnis berechnet oder
nur abgelesen? Haben Sie eine mathematische Gleichung aufgestellt?
Wenn ja, dann sollten Sie die folgende Aufgabe mit Ihrer Gleichung lösen
können:
198375 Sekunden sind: ? Tage, ? Stunden, ? Minuten, ? Sekunden
Wie Sie sehen, ist diese Aufgabe nicht einfach zu lösen, sondern muss mathematisch
berechnet werden. Ich möchte Ihnen an dieser Stelle aber auch das
Ergebnis zeigen, sodass Sie Ihr Ergebnis vergleichen können.
198375 Sekunden sind: 2 Tage, 7 Stunden, 6 Minuten, 15 Sekunden
Bevor wir uns das Programm und somit die Lösung anschauen, zeige ich Ihnen
den Ansatz für die Berechnungen auf. Zunächst stellt sich die Frage, was wir
benötigen, um die Aufgabe zu lösen? Die Antwort ist einfach:
- Subtraktion ( )
Minus
- Division ( / ) Dividieren
- Modulo ( % ) Restwert einer Division
- Abrunden
Wir gehen nun Schritt für Schritt die Berechnungen durch. Sie werden feststellen,
dass es viel einfacher ist, als Sie denken.
function makeDifferenz($first, $second)
@param integer $first
@param integer $second
@return array
Die Funktion makeDifferenz() benötigt zum einen den TimeStamp der Vergangenheit
oder der Gegenwart. Als zweiten Parameter benötigen wir den
Timestamp (Sekunden) der Zukunft oder der Gegenwart. Je nachdem, was Sie
berechnen möchten, kann hier der Wert ein anderer sein.
Sie müssen sich nicht darum kümmern, welcher Wert wo hingehört. Innerhalb
der Funktion wird dies überprüft (37). Wir errechnen also bei der Abfrage
gleich die Differenz (38, 40) zwischen den Werten.
Bei allen Berechnungen ist es sehr wichtig, dass wir nur mit Ganzzahlen
rechnen, also nicht mit Fließkommazahlen. Aus diesem Grund ziehen wir
nach jeder Berechnung die zuvor ermittelten Sekunden, Minuten und Stunden
jeweils ab und rechnen nur noch mit dem Restwert. Erst zum Schluss, also bei
den Tagen, werden wir einmal abrunden.
Im ersten Schritt errechnen wir aus der Differenz die Sekunden. Da eine
Minute 60 Sekunden hat, müssen wir aus dem Differenzwert den Modulos-Wert
ermitteln. Beim Modulos-Wert
handelt es sich um den Restwert einer Division. Nehmen wir einmal an, dass der Differenzwert 67 (Sekunden) ist.
Somit ergibt sich folgende Berechnung (42):
67 / 60 = 1 Restwert 7
Wie Sie sehen, war die Berechnung der Sekunden ein Kinderspiel. Wir wollen
für die weiteren Berechnungen aber einen Differenzwert nehmen, mit dem
man alle Werte berechnen kann, also Tage, Stunden, Minuten und Sekunden.
Für die weiteren Berechnungen nehmen wir daher den Differenzwert 94358.
Alle Berechnungen beruhen fast immer auf dem gleichen Schema. Wir werden
daher die Berechnung nochmals für den zuvor erwähnten Differenzwert
durchführen.
Berechnung der Sekunden (42)
94358 / 60 = 1572 Restwert 38
1572 * 60 = 94320
Wir haben jetzt also 1572 Minuten und 38 Sekunden. Nun müssen die ermittelten
geraden Minuten in Stunden umgerechnet werden, auch hier wieder mit
dem Modulos-Operator.
Zuvor ziehen wir die bereits ermittelten Sekunden
von unserem Differenzbetrag ab. Bei dieser Modulos-Berechnung
müssen wir
berücksichtigen, dass eine Stunde 60 Minuten hat. Als Ergebnis erhalten wir
den Restwert, also die Minuten.
Berechnung der Minuten (44)
94358 – 38 = 94320 / 60 = 1572 / 60 = 26 Restwert 12
26 * 60 = 1560
Somit haben wir als Zwischenergebnis 26 Stunden, 12 Minuten und 38 Sekunden.
Im nächsten Schritt errechnen wir die Stunden. Ein Tag hat 24 Stunden,
und mit dem Modulos-Operator
sollte auch hier die Berechnung ohne Probleme
durchführbar sein. Wir müssen aber auch hier erst die bereits ermittelten
Sekunden und Minuten abziehen. Nach der Berechnung mit dem Modulos-Operator
erhalten wir den Restwert der Stunden.
Berechnung der Stunden (46)
94358 – 38 = 94320 / 60 = 1572 – 12 = 1560 / 60 = 26 / 24 = 1 Restwert 2
1 * 24 = 24
Nach dieser Berechnung haben wir nun 2 Stunden, 12 Minuten und 38 Sekunden.
Im letzten Schritt müssen wir lediglich die Tage berechnen. Auch hier gilt
es wieder, erst alle ermittelten Werte von dem Differenzbetrag abzuziehen und
zum Schluss durch 24 zu teilen. In diesem Fall werden wir allerdings meistens
eine Fließkommazahl erhalten, die wir nur noch abrunden müssen.
Berechnung der Tage (48)
94358 – 38 = 94320 / 60 = 1572 – 12 = 1560 / 60 = 26 / 24 = 1.083333333
˜ 1
Nun haben wir alle Werte zusammen. Das Ergebnis lautet 1 Tag, 2 Stunden, 12
Minuten und 38 Sekunden.
Im letzten Schritt müssen wir nur noch die passenden Namen mit in das Array
schreiben, sodass nicht 1 Stunden, sondern 1 Stunde ausgegeben wird. Wir
geben also das komplette Array an die Funktion makeString() (50).
Sie sehen nach den Erklärungen der Funktionen den kompletten Arrayinhalt
für unsere Beispiele. Mit ihrer Hilfe können Sie wunderbar den Aufbau des
Arrays sehen.
035:
036: 037: 038: 039: 040: 041: 042: 043: 044: 045: 046:
047: 048:
049: 050: 051: 052: 053: 054: |
function makeDifferenz($first, $second){
if($first > $second)
$td['dif'][0] = $first - $second;
else
$td['dif'][0] = $second - $first;
$td['sec'][0] = $td['dif'][0] % 60; // 67 = 7
$td['min'][0] = (($td['dif'][0] - $td['sec'][0]) / 60) % 60;
$td['std'][0] = (((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) % 24;
$td['day'][0] = floor( ((((($td['dif'][0] - $td['sec'][0]) /60)- $td['min'][0]) / 60) / 24) );
$td = makeString($td);
return $td;
}
|
Beispiel 2.5: verstrichene_zeit.php
function makeString($td)
@param array $td
@return array
Die Funktion makeString() erwartet als Parameter das komplette Array mit
den gefüllten Werten der Zeitberechnung. Wir prüfen lediglich jeweils den
Inhalt der Arrays, also ob ein Tag, eine Stunde, eine Minute oder eine Sekunde
den Wert 1 hat. Diese Funktion dient lediglich für die spätere Ausgabe der
Werte, damit nicht z. B. 1 Stunden, sondern 1 Stunde ausgegeben wird.
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
|
function makeString($td){
if ($td['sec'][0] == 1)
$td['sec'][1] = 'Sekunde';
else
$td['sec'][1] = 'Sekunden';
if ($td['min'][0] == 1)
$td['min'][1] = 'Minute';
else
$td['min'][1] = 'Minuten';
if ($td['std'][0] == 1)
$td['std'][1] = 'Stunde';
else
$td['std'][1] = 'Stunden';
if ($td['day'][0] == 1)
$td['day'][1] = 'Tag';
else
$td['day'][1] = 'Tage';
return $td;
} |
Beispiel 2.6: verstrichene_zeit.php
Sie haben jetzt bereits die beiden Funktionen für die Darstellung und die
Zeitberechnung gesehen. Der restliche Quellcode dient hier lediglich für unser
Beispiel. Wichtig ist, dass Sie immer die Zeit im TimestampFormat
übergeben,
also die Sekunden. Wie Sie Ihre Werte dabei in ein Timestamp bekommen, ist
Ihnen überlassen. Wir haben hierfür die Funktion mktime() genutzt.
mktime() besitzt hier folgende Werte:
mktime(Stunde, Minute, Sekunde, Monat, Tag, Jahr)
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
|
$secLast = time();
$secNow = mktime ( 18, 0, 0, 6, 10, 2006 );
$td = makeDifferenz($secLast, $secNow);
echo 'Die Eröffnungsspiel der WM 2006 ist in<br>';
echo $td['day'][0] . ' ' . $td['day'][1] . ', ' . $td['std'][0] . ' ' .
$td['std'][1] . ', ' . $td['min'][0] . ' ' . $td['min'][1] . ', ' .
$td['sec'][0] . ' ' . $td['sec'][1];
echo '<br><br>';
$secLast = time();
$secNow = mktime ( 18, 35, 0, 04, 19, 2006 );
$td = makeDifferenz($secLast, $secNow);
echo 'Das Angebot endet in<br>';
echo $td['day'][0] . ' ' . $td['day'][1] . ', ' . $td['std'][0] . ' ' .
$td['std'][1] .
', ' . $td['min'][0] . ' ' . $td['min'][1] . ', ' .
$td['sec'][0] . ' ' . $td['sec'][1];
echo '<br><br>';
$secLast = mktime ( 13, 12, 35, 3, 29, 2006 );
$secNow = time();
$td = makeDifferenz($secLast, $secNow);
echo 'Ihr letzter Besuch war vor:<br>';
echo $td['day'][0] . ' ' . $td['day'][1] . ', ' . $td['std'][0] . ' ' . $td['std'][1] .
', ' . $td['min'][0] . ' ' . $td['min'][1] . ', ' . $td['sec'][0] . ' ' . $td['sec'][1]; |
Beispiel 2.7: verstrichene_zeit.php
Inhalt des Arrays
Sie sehen hier noch einmal das komplette Array aus einer Berechnung. Somit
haben Sie die Möglichkeit, die einzelnen Werte selbst zu formatieren und
auszugeben. Der Differenzbetrag beider von Ihnen übergebenen Werte wird
ebenfalls mit in das Array aufgenommen und kann bei Bedarf ausgegeben
werden.
Array
(
[dif] => Array
(
[0] => 4851342
)
[sec] => Array
(
[0] => 42
[1] => Sekunden
)
[min] => Array
(
[0] => 35
[1] => Minuten
)
[std] => Array
(
[0] => 3
[1] => Stunden
)
[day] => Array
(
[0] => 56
[1] => Tagen
)
)
Array
(
[dif] => Array
(
[0] => 360642
)
[sec] => Array
(
[0] => 42
[1] => Sekunden
)
[min] => Array
(
[0] => 10
[1] => Minuten
)
[std] => Array
(
[0] => 4
[1] => Stunden
)
[day] => Array
(
[0] => 4
[1] => Tagen
)
)
Array
(
[dif] => Array
(
[0] => 1473103
)
[sec] => Array
(
[0] => 43
[1] => Sekunden
)
[min] => Array
(
[0] => 11
[1] => Minuten
)
[std] => Array
(
[0] => 1
[1] => Stunde
)
[day] => Array
(
[0] => 17
[1] => Tagen
)
) |
Ausgabe im Browser
Das Eröffnungsspiel der WM 2006 ist in
56 Tagen, 3 Stunden, 35 Minuten, 42 Sekunden
Das Angebot endet in
4 Tagen, 4 Stunden, 10 Minuten, 42 Sekunden
Ihr letzter Besuch war vor:
17 Tagen, 1 Stunde, 11 Minuten, 43 Sekunden
|
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|