• Zeitformate, Datum und Co

    In diesem Tutorial wird euch die Möglichkeit geboten einen Einblick/Überblick in die Datums- und Zeit-Funktionen von PHP zu bekommen.
    Die Daten-Typen von mysql finden hier keine Erwähnung. Im Zusammenspiel von PHP mit der Datenbank mysql sollte man aber auf jeden Fall die Thematik vorher nochmal vertiefen.

    Inhalt:

    time()
    Das wohl wichtigste, um mit Daten (plural Datum) zu rechnen ist der UNIX-timestamp. Gezählt werden hierbei die Sekunden, die seit dem 01.01.1970 00:00h vergangen sind.
    Der Vorteil dieses festen Bezuges liegt darin, dass man nun einen definierten integer-Wert hat, mit dem sich gut rechnen läßt. Doch dazu später mehr.
    Der aktuelle Wert läßt sich mittels time() ausgeben:
    PHP-Code:
    <?php
      
    echo time();
    ?>
    mktime
    Selbstverständlich ist es möglich auch den timestamp eines anderen Zeitpunktes zu ermitteln. Dabei hilft die Funktion mktime.
    PHP-Code:
    <?php
      
    // 24.12.2006 16:00:00
      
    $jahr    2006;
      
    $monat   12;
      
    $tag     24;
      
    $stunde  16;
      
    $minute  0;
      
    $sekunde 0;

      
    // 24.12.2006 --> 1166972400
      
    echo mktime($stunde$minute$sekunde$monat$tag$jahr);
    ?>
    kurz: wieviele Sekunden sind seit Beginn der UNIX-Epoche bis zu dem Zeitpunkt vergangen.

    Anmerkung: Wer in das PHP-Handbuch schaut, der kann feststellen, dass man der Funktion als weiteren Parameter noch die Einstellung für Sommer- und Winterzeit angeben kann. Des weiteren ist es möglich von links nach rechts einzelne Werte weglassen kann. Dann würden diese automatisch mit dem aktuellen Wert angenommen.

    Falsche Werte werden korrigiert, so dass es möglich ist, mit den Angaben zu rechnen. Bekanntlich gibt es den 45.12.2006 nicht:
    PHP-Code:
    <?php
      
    // 24.12.2006 16:00:00 + 21 Tage
      
    $jahr    2006;
      
    $monat   12;
      
    $tag     24;  // es kommen 21 Tage hinzu - siehe Argument in der mktime-Funktion
      
    $stunde  16;
      
    $minute  0;
      
    $sekunde 0;

      
    // 14.01.2007 --> 1168786800
      
    echo mktime($stunde$minute$sekunde$monat$tag+21$jahr);
      
    // Hinweis: Bei dem Argument für den Tag, habe ich 21 Tage hinzugezählt.
    ?>
    Nun dürfte jedem klar sein, wie man einfach die Differenz zwischen 2 Zeitpunkten errechnen kann: UNIX-timestamp von dem einen Zeitpunkt minus den der Vergangenheit gleich Zeitdifferenz in Sekunden.

    Hinweis:
    1 Minute = 60 Sekunden
    1 Stunde = 60*60 Sekunden (3600)
    1 Tag = 60*60*24 Sekunden (86.000)

    Beispiel: 25 Tage = 60*60*24*25 = 2160000 Sekunden

    Wie man nun aus den 2160000 Sekunden einen Wert in Tagen bekommt? Nun einfach durch 60*60*24 Teilen und das Ergebniss ggf. noch runden.

    checkdate
    Um zu überprüfen, ob ein Datum existiert (man denke an den 30.02.) stellt PHP die Funktion checkdate zur Verfügung, welche wie folgt genutzt werden kann:
    PHP-Code:
    <?php
      
    // die Daten könnten ebenso gut aus der Übergabe von Daten aus einem Formular stammen.
      // 30.02.2009
      
    $tag 30;
      
    $monat 2;
      
    $jahr 2009;
      if(
    checkdate($monat$tag$jahr))
      {
        echo 
    'Datum gültig!';
      }
      else
      {
        echo 
    'Datum nicht gültig!';
      }

      
    // nun noch als Vergleich der 10.02.2009. Dafür ändere ich nur den Tag.
      
    $tag 10;
      if(
    checkdate($monat$tag$jahr))
      {
        echo 
    'Datum gültig!';
      }
      else
      {
        echo 
    'Datum nicht gültig!';
      }
    ?>
    Wenn das Datum, bestehend aus Monat, Tag und Jahr gültig ist, sprich existiertm dann gibt die Funktion TRUE zurück, weshalb es auch möglich ist das wie in dem Beispiel in ein if-Konstrukt einzubauen.


    date
    Die Funktion date() dürfte die wohl am meisten genutzte Datumsfunktion sein.

    Hier lohnt sich auf jeden Fall mal ein Blick ins Handbuch: date

    date() erwartet als Parameter einen string. Der String definiert die Formatierung der Ausgabe. Dafür sind einige Zeichen definiert.

    PHP-Code:
    <?php
      
    echo date('d.m.Y')
    ?>
    Dabei werden alle Zeichen, die nicht definiert sind als ebensolche Zeichen ausgegeben. Daher werden die Punkte dort auch als Punkte ausgegeben.

    Am besten ist es, einfach mal ein paar verschiedene Werte auszuprobieren.

    Das schöne an der date-Funktion ist, dass mal optional als zweiten Parameter einen UNIX-timestamp angeben kann. Dann wird nicht der aktuelle Wert in der gewünschten Form ausgegeben, sondern der des timestamps.

    PHP-Code:
    <?php
      
    echo date('d.m.Y'1166972400);

      
    // oder alternativ:
      
    $jahr    2006;
      
    $monat   12;
      
    $tag     24;
      
    $stunde  16;
      
    $minute  0;
      
    $sekunde 0;
      echo 
    date('d.m.Y'mktime($stunde$minute$sekunde$monat$tag$jahr));
    ?>
    microtime()
    microtime funktioniert ähnlich zu time, jedoch werden hier auch Mikrosekunden zurückgegeben.

    Beispiel:
    PHP-Code:
    <?php
      
    echo microtime();
    ?>
    das ergibt dann eine Ausgabe, wie zB folgende:
    Code:
    0.04687700 1163424951
    
    Dabei stellt die erste Zahl den Teil der Mikrosekunden dar und der zweite Teil die Ausgabe wie bei time().

    Um diese nun von einander zu trennen kann man die Funktion explode nutzen:
    PHP-Code:
    <?php
      
    list($usec$sec) = explode(" "microtime());
      echo 
    'Sekunden: '.$sec.'<br />';
      echo 
    'Mikrosekunden: '.$usec;
    ?>
    Darüber kann man nun berechnen, wie lange ein Skript braucht um bearbeitet zu werden.

    Leichter geht das übrigens seit PHP5, denn dort kann man der Funktion einen Parameter übergeben:
    PHP-Code:
    <?php
      
    echo microtime(true);
    ?>
    Nun sieht die Ausgabe ein wenig anders aus. Die Zeit wird als float ausgegeben.

    Im manual steht, wie es geht, wenn man mit PHP5 die Skriptlaufzeit messen will:
    PHP-Code:
    <?php
    $start 
    microtime(true);

    // hier arbeitet euer Skript

    $end microtime(true);

    echo 
    'das Skript brauchte '.($end-$start).' Sekunden';
    ?>
    kleine Anmerkung - wenn ihr das testen wollt, dann kann euch die Funktion usleep helfen, die eine Verarbeitungszeit vortäuscht, weil sie die Arbeit des Skripts an der Stelle um den angegebene Wert verzögert.


    easter_date
    Die Funktion date() kennt ihr ja bereits. Der Funktion kann man einen Zeitpunkt übergeben, um diesen im gewünschten Format auszugeben.
    Ein interessanter Zeitpunkt ist der Tag des Ostersonntags. Logischerweise findet der stets an einem Sonntag statt. Um genau zu sein, es ist seit dem Jahr 325 als der erste Sonntag nach dem ersten Vollmond des Frühlings definiert. Das Benutzen von astronomischen Tafeln wurde durch die Osterformel von C.F. Gauß vom Jahre 1800 überflüssig. Auf dieser Osterformel basieert auch die Funktion easter_date().

    Folgendes Skript
    PHP-Code:
    <?php
      
    echo easter_date();
    ?>
    ergibt lediglich den UNIX-timstamp des Ostersonntags des aktuellen Jahres aus. Um den eines bestimmten Jahres zu bekommen, kann man der Funktion einfach die gewünschte Jahreszahl übergeben (von 1970 bis 2037):
    PHP-Code:
    <?php
      
    echo easter_date(2010);
    ?>
    Das kann man sich zu Nutze machen und es mit date() verknüpfen:
    PHP-Code:
    <?php
      
    echo 'Ostersonntag 2010: '.date('d.m.Y' ,easter_date(2010));
    ?>
    Ausgabe:
    Code:
    Ostersonntag 2010: 04.04.2010
    
    Das an sich wäre wenig spektakulär, aber davon abhängig ergeben sich folgende Feiertage:
    Karfreitag: 2 Tage abziehen
    Aschermittwoch: 46 Tage abziehen
    Christi Himmelfahrt: 39 Tage addieren
    Pfingsten 49 Tage später
    Fronleichnam 60 Tage später

    Pfingstsonntag kann man nun also so bestimmen:
    PHP-Code:
    <?php
      
    echo 'Pfingstsonntag: '.date('d.m.Y'mktime(000date('m'easter_date(2010)), date('d'easter_date(2010)+49), 2010));

      
    // Ausgabe ist dann:
      // Pfingstsonntag: 23.05.2010
    ?>
    Wo wir gerade bei Feiertagen sind...
    Muttertag ist der zweite Sonntag im Mai:
    PHP-Code:
    <?php
      
    echo 'Muttertag 2010: '.date('d.m.Y'mktime(000, (14-date('w'mktime(000502010))), 2010));

      
    // Ausgabe ist dann:
      // Muttertag 2010: 09.05.2010
    ?>
    der 1. Advent ist der erste Sonntag nach dem 26. November:
    PHP-Code:
    <?php
      
    echo '1. Advent 2010: '.date('d.m.Y'mktime(0001126+(7-date('w'mktime(00011262010))), 2010));

      
    // Ausgabe ist dann:
      // 1. Advent 2010: 28.11.2010
      // der 2., 3. und 4. Advent ergeben sich daraus.
    ?>
    Der Vollständigkeit halber sei an dieser Stelle noch erwähnt, dass eine Woche vor dem 1. Advent 'Totensonntag/Ewigkeitssonntag' ist. Eine weitere Woche vorher ist Volkstrauertag.

    Buß- und Bettag ist 11 Tage vor dem 1. Advent. Also wie eben - nur 11 Tage im mktime abziehen:
    PHP-Code:
    <?php
      
    echo 'Buß- und Bettag 2010: '.date('d.m.Y'mktime(0001126+(7-date('w'mktime(00011262010)))-112010));

      
    // Ausgabe ist dann:
      // Buß- und Bettag 2010: 17.11.2010
    ?>
    Wann Weihnachten ist, ist klar? :) Ok, damit zu den Feiertagen, die sich von Jahr zu Jahr ändern...


    easter_days
    Manchmal reicht einem, wenn man weiß, wieviele Tage zwischen dem 21. März und dem Ostersonntag liegen. Da hilft die Funktion easter_days().
    Beispiel:
    PHP-Code:
    <?php
      
    echo easter_days();
    ?>
    Im Jahr 2010 liegen dort exakt 14 Tage dazwischen. Auch hier gilt wieder: Wenn der Parameter der Funktion leer ist, dann gilt das aktuelle Jahr. Ansonsten muss man eine Jahreszahl übergeben.


    date_sunrise
    Mit dieser Funktion ist es möglich (ab PHP5) den Zeitpunkt des Sonnenaufganges zu berechnen. Der Funktion werden lediglich ein paar notwendige Ortsangaben mitgegegben, damit die Uhrzeit auch stimmt! Schließlich gilt für München eine andere Zeit als für Paris!

    Für das Beispiel Bremen gilt:
    Latitude: 53.04 North
    Longitude: 8,48 Osten
    Zenith ~= 90
    offset: +1 GMT
    PHP-Code:
    <?php
      
    echo 'Sonnenaufgang in Bremen am: '.date("d.m.Y").' um '.date_sunrise(time(), SUNFUNCS_RET_STRING53.048.48901);
    ?>
    das ergibt dann sowas in der Art:
    Code:
    Sonnenaufgang in Bremen am: 13.11.2006 um 07:51
    
    Wenn ihr wisst, wie man den Zenith bestimmen kann, dann freue ich mich über Infos!
    Zitat Zitat von wikipedia.org
    Für Beobachter nördlich bzw. südlich der Wendekreise ist die Sternhöhe der Sonne immer <90°. Für diese kann die Sonne nie im Zenit stehen, sondern nur eine maximale Sternhöhe haben. Dieser Punkt heißt Kulmination.
    Quelle: http://de.wikipedia.org/wiki/Zenit_(Richtungsangabe)


    date_sunset
    Auf die gleiche Weise lässt sich auch der Zeitpunkt des Sonnenunterganges bestimmen:
    PHP-Code:
    <?php
      
    echo 'Sonnenuntergang in Bremen am: '.date("d.m.Y").' um '.date_sunset(time(), SUNFUNCS_RET_STRING53.048.48901);
    ?>
    setlocale
    hier lohnt auf jeden Fall ein Blick ins Handbuch!
    setlocale

    Mit dieser Funktion werden lokale Informationen gesetzt. Das kann zB die Zeit betreffen.

    PHP-Code:
    <?php
      setlocale
    (LC_TIME"de_DE"'de_DE@euro''de''ge');
    ?>
    Mit strftime kann man dann eine 'deutsche' Ausgabe bekommen:

    strftime
    bei dieser Funktion lohnt sich ein Blick ins Handbuch:
    strftime

    Die Werte nach dem % sind definiert. Eine Liste ist im Handbuch aufgeführt. So ergibt folgender Code:

    PHP-Code:
    <?php
      setlocale
    (LC_TIME"de_DE"'de_DE@euro''de''ge');

      
    /* Ausgabe: Freitag 22 Dezember 1978 */
      
    echo strftime ("%A %e %B %Y"mktime (00012221978));
    ?>
    Die Ausgabe nach dem Schema:
    Wochentag, Tag im Monat, Monat, Jahr.
    In diesem Fall den 22.12.1978.

    Anmerkung:
    Zitat Zitat von http://www.zend.com/manual/function.strftime.php
    Not all conversion specifiers may be supported by your C library, in which case they will not be supported by PHP's strftime(). Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. %e, %T, %R and %D (there might be more) and dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems. For Windows systems a complete overview of supported conversion specifiers can be found at this MSDN website.
    Das ist also betriebssystembedingt bzw von der C lib abhängig.


    Jetzt solltet Ihr eigentlich in der Lage sein, Datums- und Zeitfunktionen bei PHP anzuwenden. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.
    Weitere - hier nicht behandelte - Zeitfunktionen sind:
    Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
    Danke.

    Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.

    Grüße Jann Hendrik
  • Neue Blog-Einträge

    Adventure-PHP-Framework 1.12 erschienen

    Ich bin bisher nicht dazu gekommen - und wollte eigentlich die beiden links nennen: :arrow: http://www.golem.de/1008/77097.html :arrow:...

    20.08.2010 16:09

    Britische Regierung hält am IE6 fest

    Man könnte auch sagen "Tot erhoffte leben länger" :arrow: http://www.golem.de/1008/77035.html Leider sind halt in vielen Unternehmen speziell an den IE angepasste Programme im Einsatz, die es...

    20.08.2010 16:12

    Hosting-Dienst GitHub erreicht Millionen-Marke

    Während ich persönlich noch immer gerne SVN einsetze, ist git gerade voll im Trend. GitHub hatte die Tage zu vermelden, dass es mehr als eine Million Softwareprojekte "unter seinem Dach" hat....

    20.08.2010 16:15

    Screenshot unter Windows vom aktiven Fenster erstellen

    Der Trend, nicht nur einen Bildschirm bei der Arbeit am PC zu verwenden ist imho vorhanden. Wer - wie ich - gerne zwischendurch einen screenshot macht, der dürfte sich ggf. manches Mal geärgert...

    20.08.2010 16:20

    ListView-Spalten Automatisch ausrichten

    Listviews begegnen uns eigentlich jeden Tag aufs neue bei der täglichen Arbeit. Genauso oft nervt es, wenn man z.b. im Explorer Spalten verschieben muss, um einen Dateinamen einer Datei vollständig...

    24.08.2010 13:10
  • Neue Beiträge

    Sekundentakt

    Hi,

    ich weiß nicht genau, wie Deine Subselects aussehen. Aber falls die sich so ähnlich formulieren lassen:

    Code:
    SELECT something
    

    CONCAT_WS mit LEFT JOIN

    Sekundentakt 01.09.2010 15:30 Gehe zum letzten Beitrag
    DasMööp

    *ohje ... Antwort: Subselect *rolleye, damit fällt dann der JOIN weg.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 13:29 Gehe zum letzten Beitrag
    DasMööp

    Hallo,

    bei einer Abfrage von zwei Tabellen ist in einer in zwei Spalten je die ID der einen hinterlegt und diese brauche ich in der CONCAT.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 12:17 Gehe zum letzten Beitrag
    floppy

    Hallo DEVWinC, Hallo Spezialisten,

    ich stehe zur Zeit auf dem gleichen Problem, bei mir gibts beim BartPE (XP) nur einen BlueScreen nach

    [Booten] ISO-Images mit Bootloader starten & BartPE

    floppy 31.08.2010 10:48 Gehe zum letzten Beitrag

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48