Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Zeitformate, Datum und Co

Layoutprobleme? - Styleswitcher!

Antwort
 
Themen-Optionen
Alt 05.12.2006, 19:48 Nach oben    #1
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.539
Standard [PHP] Zeitformate, Datum und Co

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

Geändert von Jann Hendrik (26.05.2007 um 12:14 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

« [PHP] Counter mit mysql (kurz und knackig) | [AJAX] Eine Einführung in AJAX und XMLHttpRequest »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Mit PHP dynamisch einen RSS-Feed aktualisieren Jann Hendrik Tutorials 0 13.03.2007 10:52
[TUTORIAL-Frage] Zeitformate, Datum und Co Byrel PHP-Programmierung 8 11.12.2006 20:26
[PHP] dynamischer Verzeichnisschutz mit .htaccess Jann Hendrik Tutorials 0 21.03.2006 16:27
Eigenes Datum Maybe PHP-Programmierung 8 19.02.2006 19:59
[PHP] Gästebuch auf Textdatei basierend Jann Hendrik Tutorials 4 11.01.2006 08:50


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:49 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.6.7, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

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