php-resource.de

PHP Tutorial: Spielereien mit Zeit und Datum

Das Rechnen mit Datum und Zeit ist nur selten unproblematisch, PHP stellt uns dafür zahlreiche Funktionen zur Verfügung. Wir wollen uns im folgenden ein paar davon ansehen und an Beispielen erproben.

|09.04.2010 | Stephane | 26280 | KAT : PHP | | Kommentare 0


2

3

Auf den Tag gebracht!

In vielen Fällen hat man eine vollständige Zeitangabe mit Datum, Stunden und Minuten, interessiert sich aber nur für Teile der Zeit, beispielsweise für den Tag an sich. In der Praxis möchte man oft wissen vor wie vielen Tagen eine Datei verändert oder erzeugt wurde.

Um die Minuten oder auch die Stunden verschwinden zu lassen benutzen wir unsere Funktion "mktime", der wir wir nur die Aspekte Monat, Tag und Jahr zur Berechnung der Unix-Zeit übergeben. Alle anderen Angaben können lassen wir außer acht, bzw. setzen sie auf Null. Mit dem Ergebnis in Form der Unix-Zeit können wir komfortabel weitere Berechnungen durchführen. Beispielsweise ziehen wir von dem aktuellen Datum ein anderes Datum ab. Das Ergebnis sind die vergangenen Tage in Sekunden, die wir in Stunden (3600 Sekunden) oder in Tage (3600*24 bzw. 86400 Sekunden) umrechnen.

     
    $Jahr = 2010; $Monat = 04; $Tag = 01;
    echo (  mktime(0,0,0,date('m'),date('d'),date('Y')) - mktime(0,0,0,$Monat,$Tag,$Jahr) )/ (3600*24) ;
    

Achtung!

Die Parameter der jeweiligen Zeiteinheiten müssen tatsächlich getrennt innerhalb von "mktime" angegeben werden. Eine Kurzform in der Art "mktime(0,0,0,date('m,d,Y'))" gibt keinen Fehler aus, liefert aber falsche und unerwartete Ergebnisse. "mktime" erkennt die Trennung der von date übergebenen Werte nicht, versucht aber die jetzt fehlenden oder falschen Angaben ohne weitere Meldung zu kompensieren.

Das Geheimnis der fehlenden Stunde

Wie vieles andere, so hat auch die einfache Berechnung der Tage mit der Unix-Zeit ein dunkles Geheimnis. An manchen Tagen fehlt uns eine ganze Stunde. So beträgt der Abstand vom 28. zum 29.03.2010 oder vom 29. zum 30.03.2009 nicht ein Tag, also 24 Stunden, sondern lediglich 23 Stunden.

     
    echo (  mktime(0,0,0,03,29,2010) - mktime(0,0,0,03,28,2010) )/ 3600 ;
    echo (  mktime( 0,0,0,03,30,2009) - mktime( 0,0,0,03,29,2009 ) )/ 3600 ;
    

Die grausame Realität, dass der Tag tatsächlich keine vollen 24 Stunden hat, holt uns hier vermutlich ein und verdirbt uns unsere Berechnungen. Man muss also berücksichtigen, dass das Ergebnis nicht immer einen Integer-Wert liefert. Sobald ich die tatsälichen Hintergründe kenne, werde ich dies hier genauer ausführen.
Bis dahin kann man das Ergebnis mit der Funktion "ceil()" etwas "schönen", indem das Ergebnis zu ganzen Tagen aufgerundet wird.

Vor wie vielen Tagen wurde eine Datei zuletzt bearbeitet?

Nehmen wir einen konkreten Fall bei dem wir wissen möchten, vor wie vielen Tagen eine Datei zuletzt bearbeitet wurde. Wir erfragen mit "filemtime()" die Unix-Zeit der letzten Änderung und schicken von diesem Ergebnis mit Hilfe von "date" den Tag, Monat und das Jahr in die Funktion "mktime". Das gleiche machen wir mit dem aktuellen Datum und ziehen davon das Ergebnis der Datei ab und rechnen es in Tage um.

     
    $t = filemtime('c:/ordner/datei.txt');
    $datei = mktime(0,0,0,date('m',$t),date('d',$t),date('Y',$t));
    $heute = mktime(0,0,0,date('m'),date('d'),date('Y'));
    echo ($heute - $datei) / 86400;
    

Das Alter aus Dateinamen bestimmen

Oft interessiert uns nicht der Zeitpunkt der letzten Bearbeitung, sondern eine Datumsangabe, die beispielsweite im Dateinamen vorliegt. Auch hier lesen wir die Datumsangaben aus, rechnen sie wie beschrieben um und vergleichen das Ergebnis mit dem aktuellen Datum.
Dazu empfiehlt es sich reguläre Ausdrücke zu verwenden. Natürlich kann man auch mit gängigen Befehlen wie "substr" versuchen die Datumsangaben auszulesen, schließlich kann man auch mit verbundenen Augen über eine Straße gehen oder eine Metall-Gabel in die Mikrowelle legen.
Da wir aber alle wissen, dass sich Dateinamen gerade von der Länge her nie wirklich dauerhaft an festgelegte Konventionen halten, verwenden wir reguläre Ausdrücke.

     
    $Dateiname = 'dateiname24122009-xy-001.jpg';
    preg_match('/(dd)(dd)(dddd)/',$Dateiname,$Ergebnis);
    $tag = $Ergebnis[1];
    $monat = $Ergebnis[2];
    $jahr = $Ergebnis[3];
    $datei = mktime( 0,0,0,$monat,$tag,$jahr );
    $heute = mktime(0,0,0,date('m'),date('d'),date('Y'));
    echo ($heute - $datei) / 86400;
     
    

Natürlich kann man den regulären Ausdruck und auch den Programmcode kürzer gestalten, für die Lesbarkeit ist dies aber nicht hilfreich:

     
    preg_match('/(dd)(dd)(d)/','dateiname01042010-xy-001.jpg',$Erg);
    echo (mktime(0,0,0,date('m'),date('d'),date('Y'))-mktime(0,0,0,$Erg[2],$Erg[1],$Erg[3]))/86400;
    
Navigation -> Seitenanzahl : (3)

  «  1 2 3  » 
Kommentare zum Tutorial
Tutorial kommentieren
 
Über den Autor
Stephane

Stephane

Status
Premium Mitglied

Beruf
Angestellter

Mitglied seit:
08.04.2010

letzte Aktivität
20.05.2010

 

Tutorial bewerten

Hat Ihnen dieses Tutorial gefallen? Dann bewerten Sie es jetzt! Fünf Sterne bedeutet "Sehr gut", ein Stern "Unzureichend".



 

aktuelle Artikel

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Neu | Berni

Wissensbestand in Unternehmen

Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Neu | Berni