Teil von  SELFPHP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++



:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP? In über 120.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Verstrichene Zeit in Tagen, Stunden, Minuten und Sekunden anzeigen


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 18006102006 );

$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 1835004192006 );

$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 1312353292006 );
$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.


 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


Microsoft Deutschland GmbH
twosteps.net - ...Premium-Webhosting
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2009 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt