Die zweite PHP-Lektion: Rechnen mit Zahlen und das Datumsformat

tempa wrote this 12:12:

Um sich noch etwas mehr mit dem Datum und Variablen austoben zu können, z.B. im Dezember mit schönen Sprüchen einen Adventskalender zu produzieren oder etwas aktueller für den kommenden Sommer Freizeittipps zu geben.

Rekapitulieren wir noch mal. „Variablen deklarieren“ geht wie folgt. Eine Variable wird mit dem $-Zeichen eingeleitet, dem der Unterstrich oder ein Buchstabe folgt. Eine Zahl darf nicht direkt nach dem Dollarzeichen stehen, dazwischen muss schon noch ein Unterstrich oder einem Buchstaben stehen. Ein Variablenname kann Zahlen enthalten, aber __nicht__ direkt dem $-Zeichen gefolgt. $XYZ123 ist zulässig, $123XYZ ist nicht zulässig. Ebenfalls unzulässig ist ein Bindestrich bzw. Minuszeichen. Das Minuszeichen ist ein Operator und führt im Variablennamen zum Syntaxfehler.

Schaut man in die PHP-Dokumentation, begegnen uns unter anderen folgende Variablentypen:

  • Wahrheitswert: (bool), (boolean) – nach boolean
  • Ganzzahl: (int), (integer) – nach integer
  • Fließkommazahl: (float), (double), (real) – nach float
  • Zeichenkette: (string) – nach string

Die restlichen Variablentypen stellen wir hinten an für spätere Exkursionen in PHP.

Ganzzahlen werden positiv oder negativ geschrieben, Ganzzahlen sind nicht gesondert markiert. Um eine Zahl in eine Variable zu speichern, wird die Zahl ohne Zusatznotationen zwischen dem Gleichheitszeichen und Semikolon geschrieben:

$ganzzahl = 10; bzw. $ganzzahl = -10;

PHP rechnet in den meisten Fällen im Dezimalsystem, muss aber nicht. Stellt man der 10 eine 0 voran so wird daraus die oktale 8 und 0x vorangestellt ergibt hexadezimal 16.

  1. $a = 10; // dezimal 10
  2. $b = 0x10; // hexadezimal: 16
  3. $c = 010; // octal: 8
  4. $d = $a + $b + $c;
  5. var_dump($a); // (int)10
  6. var_dump($b); // (int)16
  7. var_dump($c); // (int)8
  8. var_dump($d); // (int)34

PHP rechnet mit den verschiedenen Formaten im bunten Kompott problemlos, am Ende wird ein Dezimalwert ausgegeben. Im Kommentar (mit doppelten Schrägstrichen eingeleitet) ist das Format und der Wert in den Zeilen 1 bis 3 angegeben. Übrigens Kommentare mit vorangestellten Doppelschrägstrich sind einzeilig und helfen den Code verstehen. Für den Augenblick sind die Codes überkommentiert, da sehr viel noch erklärt werden muss. Mehrzeilige Kommentare werden mit Schrägstrich und Stern /* Kommentar */ umklammert.

Weiter geht es – Rechnen mit Fließkomma (floats):

  1. $a = 10; // integer
  2. $b = 0.5; // float
  3. $c = $a*$b;
  4. var_dump($a); // (int)10
  5. var_dump($b); // float(0.5)
  6. var_dump($c); // float(5)

Obwohl PHP mit echo $c; 5 und nicht 5.0 ausgibt, also Ganzzahl nach dem Erscheinungsbild, wird die 5 als Fließkommazahl registriert. Achtung: PHP verwendet englische Konventionen. Kommastellen werden mit einem Punkt statt eines Kommas dargestellt.

Das Zahlenformat lässt sich den jeweiligen nationalen Konventionen mit number_format($Fließkommazahl = 1.5, $Dezimalstellen = 0 , $Dezimaltrennzeichen = ',' , $Tausendertrennung = '\'') anpassen.

Kommen wir zum Datum. Das Datum kann, solange das Datum eines ist zwischen den Jahren 1901 und 2038 auf einem 32 Bit-System, mittels Ganzzahlen (integer) augedrückt oder durch eine Zeichenkette (string) dargestellt werden. Die Basis für alle PHP-Zeitfunktionen ist der UNIX-Timestamp, der basierend auf 32 Bit die Zeitrechnug am 1. Januar 1970 um 0:00 Uhr begann. Die Funktion time() gibt uns die aktuelle Zeit mittel des Unix-Zeittstempels als Ganzzahl. Diese Ganzzahl kann mit der Funktion date($datumsformat, $timestamp) in ein Datum gewandelt werden kann.

  1. $timestamp = time(); // Timestamp in Var speichern: 1401746400
  2. echo date("d.m.y", $timestamp); //heutiges Datum ausgeben: 21.04.14
Format Erklärung
d Tag, zweistellig: 01, 02, … , 31
j Tag, einstellig: 1, 2, … , 31
m Monat, zweistellig: 01, 02, … , 12
n Monat, einstellig: 1, 2, … , 12
F Monat, ausgeschrieben: January, Febuary, … , December
Y Jahr, vierstellig: 1901, 1902, … , 2038
y Jahr, zweistellig: 00, 01, … , 38
H 24 Stunden, zweistellig: 00, 01, 02, … , 23
G 24 Stunden, einstellig: 0, 1, 2, … , 23
i Minuten, zweistellig: 0, 1, 2, … , 59
s Sekunden, zweistellig: 0, 1, 2, … , 59
w Zahl je Wochentag: 0, 1, 2, …, 6 (0 = Sonntag, … 6 = Samstag)

Wie alles in PHP ist die Ausgabe auch beim Datum mit date() englisch, gleichgültig welche Spracheinstellung vorgenommen wurde und sofern nicht eine Sprachdatei und Sprachroutine die Monatsnamen oder Wochentage für einen ins Deutsche übersetzt, muss man hier für seinen eigene Sprachdatei und Übersetzungsroutine schreiben. Hierzu greifen wir kurz vor und nutzen einen Array array("key"=>"value", ...) für die Englisch-Deutschen Begriffspaare der Monatsnamen und Wochentage. Mit der folgenden Suchen&Ersetzen-String-Funktion strtr($text, $tauschpaare_array) kann das Datum eingedeutscht werden, und so geht’s:

  1. $de_DATES = array(
  2. 'Monday'    => 'Montag',
  3. 'Tuesday'   => 'Dienstag',
  4. 'Wednesday' => 'Mittwoch',
  5. 'Thursday'  => 'Donnerstag',
  6. 'Friday'    => 'Freitag',
  7. 'Saturday'  => 'Samstag',
  8. 'Sunday'    => 'Sonntag',
  9. 'Mon'       => 'Mo',
  10. 'Tue'       => 'Di',
  11. 'Wed'       => 'Mi',
  12. 'Thu'       => 'Do',
  13. 'Fri'       => 'Fr',
  14. 'Sat'       => 'Sa',
  15. 'Sun'       => 'So',
  16. 'January'   => 'Januar',
  17. 'February'  => 'Februar',
  18. 'March'     => 'März',
  19. 'May'       => 'Mai',
  20. 'June'      => 'Juni',
  21. 'July'      => 'Juli',
  22. 'October'   => 'Oktober',
  23. 'December'  => 'Dezember'
  24. );
  25. echo strtr(date("D, d. F Y", time()), $de_DATES);

Gleich noch ein kleines Anwendungsbeispiel mit Zahlenvariablen und Datums-Funktionen: Verbleibende Zeit bis zum Stichtag berechnen:

Stichtag-Countdown

So geht’s:

  1. $date = strtotime("6.6.2014"); // Ergebnis: 1401746400
  2. $verbleibend = $date - time(); // in Sek. am 21.04.14: 3896805
  3. echo "Stichtag: 6. Juni 2014
  4. <br> Nur noch <strong class=\"red-marker\">"
  5. .floor($verbleibend/(24*60*60)) // in Tage umrechnen
  6. ."</strong> Tage
  7. <br>bis zum Stichtag.";

Die Funktion strtotime() wandelt ein Datum (string) in den Unix-Timestamp (integer). Die Funktion strtotime() geht von einem europäischen Datumsformat (Tag vor Monat) aus, wenn Punkt (24.12.2014) oder Bindesestrich (24-12-14) als Delimiter im Datum verwendet wurden und von einem amerikanischen Datumsformat (Monat vor Tag), wenn der Delimiter zwischen Tag, Monat und Jahr ein Schrägstrich (12/24/14) ist. Zweistellige Jahreszahlen werden von 70-99 mit 1970-1999 und 00-69 mit 2000-2069 interpretiert, auch kennt die Funktion viele europäische Monatsnamen. Nachdem wir nun eine Ganzzahl zur Verfügung haben, die das gewählte Datum in Sekunden ausdrückt, können wir mit der Zahl auch rechnen. Die Funktion time() mit leerer Klammer gibt ebenfalls die Zeit in einer Sekunden zählenden Ganzzahl zurück.

Die Differenz ergibt die Sekunden von heute bis zu dem Stichtag und muss noch in Tage a 24 Stunden, jeweils a 60 Minuten und die Minute mit jeweils 60 Sekunden umgerechnet werden (&verbleibend/24*60*60). Zählen wir Tage, runden wir auch noch nach einem dreiviertel Tag und kurz vor Mitternacht die Zahl ab. Um unsere Kommazahl in eine entsprechende Ganzzahl zu verwandelt, nehmen wir daher nicht round() zum Runden, sondern floor(), mit dem grundsätzlich nach unten abrundet wird oder alternativ könnte man mit number_format ($zahl, $dezimalstellen = 0) die Nachkommastellen einfach ausblenden.

Wir rekapitulieren: Wir wissen wie eine PHP-Datei initiiert (Dateiendung *.php) wird, wie ein Script eingeleitet und geschlossen wird (<?php … ?>), wie Daten in Variablen gespeichert ($var = … ;) und die Daten ausgegeben werden können (echo), diese Datenausgabe von Bedingungen abhängig gemacht werden kann (if(Bedingung){ ... } ifelse(Bedingung) { ... } else { ... } mit Vergleichsoperatoren), wir haben vier Variablentypen kennengelernt, Boolean (true OR false), Variablentyp Zahl Ganzzahlen und Fließkommazahlen (integer AND float) kennengelernt und bereits einen flüchtigen Blick auf Text (string) und die geordnete Variablensammlung (array()) geworfen sowie nicht zuletzt uns näher mit dem Datumsformat beschäftigt.

Um sich mit dem gelernten näher vertraut zu machen, gebe Inhalte Zeitgesteuert aus. Hierzu noch ein kurzer Blick auf Rechenoperatoren in PHP:

Code Erläuterung
$a + $b Addition: Summe von $a und $b.
$a - $b Subtraktion: Differenz von $a und $b.
$a * $b Multiplikation: Produkt von $a und $b.
$a / $b Division: Quotient von $a und $b.
$a % $b Modulus: Rest von $a geteilt durch $b.

Einen Array kann man als Kommaliste abspeichern, z.B. $var = array("Text 1", "Text 2", ..., "Text n"); oder $varArray = array($var01,$var02, ...,$var23,$xmas);. Nach dem Gleichheitszeichen folgt die Anweisung array() und die Werte (values) werden von PHP durchgezählt mit dem Wert 0 (Null) beginnend. Jeder einzelne Wert kann mittels Schlüssel (key), indem man den Schlüssel in eckigen Klammern dem Variablennamen nachsetzt, angesprochen werden $var['key']. Ist der Schlüssel nicht definiert, wie in der einfachen Kommaliste ist der erste Wert $var[0], der zweite $var[1], der dritte $var[2], … etc. In einem Adventskalender wäre der Weihnachtswert, die große 24 also …? Richtig: $adventskalender[23]

Viel Spaß beim Austüffteln der ersten eigenen Script-Ideen.

Leave a Reply