PHP Tutorial – Schritt 12: Datum und Zeit Advanced

Der letzte Beitrag hat sich ja grundlegend mit der PHP Zeitfunktion auseinander gesetzt. Allerdings gibt es noch so einiges bei diesen Thema zu wissen, bzw. zu erlernen. Deshalb beschäftigen wir uns einen weiteren Beitrag mit der PHP Zeitfunktion.

|

Übungsbeispiel Differenz/Countdown

Versuchen wir im ersten Beispiel einfach nochmals die Differenz (nur in Tagen) zu einem gewissen Datum zu ermitteln. Ich nehme als Zieldatum meinen 50. Geburtstag, sprich den 30. Jänner 2029

|

Was brauchen wir dafür?

  • Das heutige Datum
  • Das Datum in der Zukunft

|

<?php

# Das heutige Datum ermitteln wir mit time()
$jetzt = time();

# Das Zukunftsdatum der 30.01.2029 um 00:00:00 wandeln wir uns in einen UnixTimestamp um
$zukunft = mktime(0,0,0,1,30,2029);

# Die Differenz der beiden in Sekunden
$differenz = $zukunft - $jetzt;

# Und das ganze rechnen wir nun in Tage um (86400sek hat ein Tag)
$diff_tage = $differenz / 86400;

# Und nun zur Ausgabe
echo "Es sind noch $diff_tage Tage bis zu Ronny´s 50er <br>";

# Diese Ausgabe ist zu genau, deshalb runden wir ab
# Dies erledigt die Funktion "round(Variable, Anzahl der Kommastellen)" für uns
$diff_tage = round ($diff_tage,0);

echo "Es sind genau noch $diff_tage Tage bis zu Ronny´s 50er";

?>

|

In Kurzform:

<?php

echo "Es sind genau noch ";
echo round((mktime(0,0,0,1,30,2029) - time()) / 86400);
echo " Tage bis zu Ronny´s 50er";

?>

|

Wie du hier sehr schön erkennen kannst, es geht sehr oft, sehr viel einfacher in PHP. Allerdings gewöhnt man sich das erst mit der Zeit an, also nicht gleich verzweifeln. Je besser du am Anfang weißt, was das Ziel ist, desto besser allerdings.

|

Datumsabfrage mit Zusatzinformationen

Oft möchte man auch einmal wissen, welches Datum in 7 Tagen oder x Tagen ist. Noch besser wäre es, wenn wir dazu Zusatzinformationen wie Wochentag oder Kalenderwoche erhalten. Insofern… ein schönes Projekt für uns, oder?

|

Welches Datum haben/hatten wir in/vor x Tagen

<?php

# Wir definieren hier ein variables Datum, z.B. 13.06.2014
$tag = 13;
$monat = 6;
$jahr = 2014;

# Wie viele Tage möchtest du vor/zurück rechnen?
# Hinweis: Zurück rechnen kannst du mit einem Minus (-) Wert
$differenz = -19;

echo date("d.m.Y",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr));

?>

|

Welchen Wochentag / Kalenderwoche hatten/haben wir da?

Wir ergänzen das Beispiel oben nun um die Zusatzinformationen Wochentag und Kalenderwoche… Schritt für Schritt

Mit der Zusatzangabe “w” bekommst du den Wochentag als Zahl zurückgeliefert. Dabei fängt PHP mit Sonntag an zu zählen UND PHP beginnt mit Null (0)!!

|

  • 0 = Sonntag
  • 1 = Montag
  • 2 = Dienstag
  • 3 = Mittwoch
  • 4 = Donnerstag
  • 5 = Freitag
  • 6 = Samstag

|

Damit wir überhaupt einmal den Wochentag als Zahl zurück bekommen ändern wir also unsere echo-Ausgabe:

echo date("d.m.Y - w",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr));

|

Je nachdem welches Datum du als Quelldatum eingegeben hast und wie viele Tage du in die Vergangenheit/Zukunft rechnest, erhälst du nun neben der Datumsausgabe eine Ziffer zwischen 0 und 6. Also müssen wir PHP lediglich noch mitteilen, dass diese Ziffer gegen ein Wort, nämlich Montag bis Sonntag,ausgetauscht werden soll.

Am einfachsten ginge das mit einem Array. Allerdings haben wir das noch nicht gelernt, deshalb bedienen wir uns eine If-Abfrage bzw. einer Switch-Abfrage:

switch(date("w",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr)))
{
	case (0):
	echo "Sonntag";
	break;
	
	case (1):
	echo "Montag";
	break;	
	
	case (2):
	echo "Dienstag";
	break;	
	
	case (3):
	echo "Mittwoch";
	break;	
	
	case (4):
	echo "Donnerstag";
	break;	
	
	case (5):
	echo "Freitag";
	break;	
	
	case (6):
	echo "Samstag";
	break;	
	
}

|

Das ganze Skript sieht nun unbereinigt (also unaufgeräumt) zurzeit so aus:

<?php

# Wir definieren hier ein variables Datum, z.B. 13.06.2014
$tag = 13;
$monat = 6;
$jahr = 2014;

# Wie viele Tage möchtest du vor/zurück rechnen?
# Hinweis: Zurück rechnen kannst du mit einem Minus (-) Wert
$differenz = -18;

echo date("d.m.Y - w",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr));
echo "<br>";

switch(date("w",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr)))
{
	case (0):
	echo "Sonntag";
	break;
	
	case (1):
	echo "Montag";
	break;	
	
	case (2):
	echo "Dienstag";
	break;	
	
	case (3):
	echo "Mittwoch";
	break;	
	
	case (4):
	echo "Donnerstag";
	break;	
	
	case (5):
	echo "Freitag";
	break;	
	
	case (6):
	echo "Samstag";
	break;	
	
}

?>

|

Da wir hier viel unnötigen Code mitschleppen, kürzen wir das ganze etwas ab und unterscheiden mit einer If-Abfrage ob wir die Vergangenheit oder Zukunft abfragen, damit wir auch die Grammatik berücksichtigen. Genau genommen ändern wir diesen Code:

echo date("d.m.Y - w",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr));
echo "<br>";

|

In diesen Code:

$datumsausgabe = date("d.m.Y",mktime(0, 0, 0, $monat, $tag+$differenz, $jahr));
echo ($differenz < 0) ? "Der $datumsausgabe war ein " : "Der $datumsausgabe ist ein ";

|

Sprich wir machen aus der ersten echo-Ausgabe eine Variable, die wir dann in einer kurzen If-Anweisung weiterverarbeiten. Ausgehend davon ob die wählbaren Differenztage positiv oder negativ eingegeben sind, wird der Satz in der Vergangenheitsform oder in der Zukunftsform definiert.

|

Noch schnellere Zeit mit strtotime

Was du bist jetzt alles gelernt hast, ist hin und wieder etwas umständlich wenn es doch mal schneller gehen soll. Was wäre also PHP wenn es da nicht wieder den einen oder anderen Trick geben würde?

|

strttotime(), also String to time (Wort zu Zeit) ist so ein Trick den die Profis meist für sich behalten. Dabei erleichtert er das Leben in PHP ungemein. Schauen wir uns doch mal an, was genau mit diesem kleinen Befehl so möglich ist:

|

Wichtig, auch strtotime() wandelt jede Angabe immer in einen UnixTimestamp um. Damit du weißt was die ausgegebenen Sekunden bedeuten, müssen sie mit date() formatiert werden.

<?php

# Dieses Skript konzentriert sich auf die Ausgabe von strtotime()
# Was immer du übermittelst, der echo-Befehl sagt dir dann das jeweilige
# als Kontrolle

# Anbei einige der möglichen strtotime()-Argumente:
# strtotime('now');
# strtotime('today');
# strtotime('tomorrow');
# strtotime('yesterday');
# strtotime('22 December 2001');
# strtotime('+2 day');
# strtotime('+2 week');
# strtotime('+2 week 3 days 4 hours 5 seconds');
# strtotime('last year');
# strtotime('+1 minute');
# strtotime('noon'); In diesem Fall erhälst du die Mittagszeit vom heutigen Datum
# strtotime('midnight'); In diesem Fall erhälst du die Mitternachtszeit vom heutigen Datum
# strtotime('noon',1270113217); In diesem Fall erhälst du die Mittagszeit vom eingegebenen Datum
# strtotime('midnight',1270113217); In diesem Fall erhälst du die Mitternachtszeit vom eingegebenen Datum

# Hier kannst du einfach ein bebliebiges strtotime()-Argument einsetzen:
$befehl = strtotime('now');

# Ab hier nichts ändern, dient nur zur Ausgabe
echo "Der UnixTimestamp für dieses strtotime()-Argument ist $befehl <br>";
echo "Umgerechnet ist wäre das der " . date('d.m.y H.i.s',$befehl);

?>

|

Bitte, wie immer, unter z.B. http://phpfiddle.org/ einfach mehrfach testen, damit das Prinzip verstanden wird. Es ist dabei lediglich die Zeile 24 zu ändern.

|

So, das wars jetzt aber über Zeit und Datum. Widmen wir uns den nächsten Kapitel: Suchen und Ersetzen