Datum

Datumsfunktionen

Es gibt zwar eine Menge Datumsfunktionen in PHP, mit denen man kann man einige Probleme lösen kann.
Funktion Bedeutung
time() Sytemszeit als Zeitstempel. Das sind die Sekunden seit 01.01.1970
microtime() Ermittelt Systemzeit sehr genau mit Microsekunden
date_default_timezone_set() Setzt die Zeitzone für alle Datums und Zeitfunktionen.
date() Formatiert ein Datum. Die Funktion liefert zudem das aktuelle Tagesdatum (das Systemdatum des Servers), wenn kein Datumswert angegeben wird (beispielsweise mit mktime, siehe unten)
checkdate Prüft ob sich ein Ausdruck als Datumswert interpretieren läßt.
mktime() Erzeugt einen absoluten Zeit/ Datumswert (Zeitstempel)
strtotime() Erzeugt eine relative Zeitangabe
getdate() Liefert ein Array mit Datums- und Zeitwerten
gettimeofday() Erzeugt einen Timestamp als assoziatives Array.
gmmktime() Erzeugt einen GMT- Zeit/ Datumswert (Zeitstempel)
SQL Zeitfunktionen SQL Zeitfunktionen ermöglichen Abfragen in Feldern mit Zeitstempeln

time()

Ermittelt die aktuelle Systemzeit. Dieser Zeitstempel ermittelt die Sekunden die seit dem 01.01.1970 verstrichen sind. Diesen Zeitstempel kann man beispielsweise mit date() in ein Datumsformat formatieren. Dazu gibt man diesen als zweiten Parameter dort ein. Allerdings ist es nicht nötig, da die date() Funktion sowieso die aktuelle Systemzeit ausgibt, wenn der zweite Parameter fehlt.

Mit time() lassen sich jedoch Berechnungen anstellen.

microtime()

microtime() erzeugt auch einen Zeitstempel wie time(), aber er ist genauer, weil auch die Microsekunden gemessen werden. Standardmäßig wird eine Zeichenkette ausgegben mit 2 Zahlen, die Microsekunden und die Sekunden. Mit dem Argument true wird eine Fließkommzahl ausgegeben. microtime(true).

Wenn man in einer For-Schleife microtime(true) 20 mal anzeigen lässt sieht man Unterschiede.

date_default_timezone_set('Europe/Amsterdam');

Setzt die Zeitzone, die von allen Datums und Zeitfunktionen genutzt werden.
Hier eine Liste unterstützter Zeitzonen.

date_default_timezone_set('Europe/Amsterdam');

date()

siehe auch PHP Manual

Mit der Date Funktion wird das aktuelle Tagesdatum des Servers ausgegeben. Durch die Reihenfolge der Formatsymbole , erhält man die gewünschte Anzeige. Im zweiten Beispiel wurde anstatt des Punktes ein Schrägstrich und Leerzeichen gesetzt.

30.12.2024
30 / 12 / 24
<?php echo date("d.m.Y") ?>
<?php echo date("d / m / y") ?>

Die Formatsymbole müssen, wenn es mehr als eines ist, in Anführungsstriche eingeschlossen werden.
Negative Werte werden von date nicht akzeptiert.

Als zweiten Parameter kann man einen Zeitstempel eingeben. Wenn das zweite Argument fehlt, wird die aktuelle Systemzeit genommen.

Anzeige Symbol Bedeutung
17 H Stunde im 24 Stunden Format
05 h Stunde im 12 Stunden Format
pm a am und pm
PM A AM und PM
10 i Minuten
46 s Sekunden
30 d Tag des Monats als zweistellige Ziffer
30 j Tag des Monats ohne führende Null bei einstelligem Tagesdatum
Mon D Wochentag in abgekürzter (englischer Schreibweise)
Monday l (L) vollständiger Wochentag
1 w Wochentag als Zahl (0=Sonntag)
12 m Zweistellige Monatsangabe
December F Monatsname in englisch
Dec M Monatsname (abgekürzte englische Schreibweise)
31 t Zahl der Tage eines Monats
24 y zweistellige Jahreszahl
2024 Y vierstellige Jahreszahl
364 z Tag des Jahres von 1 bis 365

 

Die date Funktion gibt das Systemdatum aus, wenn nur ein Argument angegeben wird. Als zweites Argument kann man ein eigenes Datum mit mktime eingeben siehe unten. Auch ein Zeitstempel aus einer Datenbank wäre möglich.

Ein zweites Argument als numerischer Wert steht für die Sekunden, die seit Beginn der Zählung am 1.1.1970 verstrichen sind. Zum Beispiel
echo date("d.m.Y", 0); liefert 01.01.1970. Dieses Datum ist der Beginn der Unix Zeitrechnung.


checkdate()

Datum auf Gültigkeit überprüfen

Mittels checkdate() läßt sich überprüfen, ob es sich um gültige Datumswerte handelt, die Argumente, sind in der Reihenfolge: Monat, Tag, Jahr. Man kann es einsetzen, ob es ein Schaltjahr ist, oder anders ausgedrückt, ob der 29. Feb in einem Jahr vorhanden ist.

ein gültiges Datum <?php
if (checkdate(2,29,2020))
echo "ein gültiges Datum";

?>

mktime()

Zeitstempel erzeugen

Will man mit Datumswerten rechnen, kann man mit mktime() einen Zeitstempel erzeugen, um ein bestimmtes Datum festzulegen. mktime() benötigt 6Argumente:
Stunde, Minute, Sekunde, Monat, Tag, Jahr.
Als siebtes Argument ist noch Sommerzeit (true) möglich.

Diesen Zeitstempel kann man sich mit date() ausgeben lassen.

22.11.2002 $ts = mktime(1,1,1,11,22,2002);
echo date("d.m.Y",$ts);
Lässt man Werte weg, werden sie durch die aktuellen Zeitwerte ersetzt. Hier wurde nur die Stunde 0 angegeben.
30.12.2024 $ts2 = mktime(0);
echo date("d.m.Y", $ts2);

strtotime()

Mit strtotime() kann man einen Zeitstempel aus einer Datenbank in einen UNIX-Zeitstempel konvertieren, damit dieser mit der date() Funktion formatiert werden kann.

Relative Zeitangaben kann man mit strtotime() erzeugen. Es wird im ersten Parameter mit Hilfe englischer Begriffe ein zeitlicher Abstand zu einem Bezugspunkt angegeben. Im zweiten Parameter wird der Bezugspunkt als Zeitstempel angegeben, wenn er fehlt wird die aktuelle Zeit genommen.

Die Zeitstempel in folgenden Beispielen werden wieder mit date("d.m.Y", $dann) als formatiertes Datum ausgegeben.

30.12.2024 strtotime("now")
10.09.2000 strtotime("10 September 2000")
31.12.2024 strtotime("+1 day")
06.01.2025 strtotime("+1 week")
02.01.2025 strtotime("next Thursday")
23.12.2024 strtotime("last Monday")
08.01.2025 strtotime("+1 week 2 days 4 hours 2 seconds")
30.07.2024 strtotime("- 5 month")
30.01.2024 strtotime("last year + 1 month")

Folgende Angaben sind möglich.

week, day, month, year

Englische Wochentage sind mit next oder last auch möglich.

Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

 


Datums Array
getdate()

Die getdate() Funktion erzeugt ein Array, dass alle Datumswerte liefert. Mit bestimmten Schlüsselworten kann man auf die Teile des Datums zugreifen.
Ein Datum vor dem 1.1.1970 erzeugt einen Fehler.

23. March.1991 10:30 1Sek <?php
$Wert =getdate(mktime(10,30,1,03,23,1991) );
echo $Wert["mday"], ". ";
echo $Wert["month"], ".";
echo $Wert["year"], " ";
echo $Wert["hours"], ":";
echo $Wert["minutes"], " ";
echo $Wert["seconds"], "Sek ";
?>
Schlüsselworte Bedeutung
mday Tag
month Monat (Name)
mon Monat (Zahl)
year Jahr
hours Stunde
minutes Minute
seconds Sekunde
wday Wochentag (Zahl)
weekday Wochentag (Name)

Hier das Ganze nochmal mit dem jetzigen Datum, getdate ohne Argument
Monday 30. December.2024 17:10 46 Sek <?php
$Jetzt =getdate();
echo $Jetzt["weekday"], " ";
echo $Jetzt["mday"], ". ";
echo $Jetzt["month"], ".";
echo $Jetzt["year"], " ";
echo $Jetzt["hours"], ":";
echo $Jetzt["minutes"], " ";
echo $Jetzt["seconds"], " Sek ";
?>
Um einen deutschen Wochentag oder Monatsnamen anzuzeigen, muß man ein Array mit den Namenselementen erzeugen. Der Index kann dann mittels wday oder mon-1 vergeben werden. Man bedenke der Monat Januar ist 0.
Montag den 30. Dezember 2024
17:10 Uhr 46 Sek
<?php
$wochentag = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
$monat = array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
$Jetzt =getdate();
echo $wochentag[$Jetzt["wday"]], " den ";
echo $Jetzt["mday"], ". ";
echo $monat[$Jetzt["mon"]-1], " ";
echo $Jetzt["year"], " <br> ";
echo $Jetzt["hours"], ":";
echo $Jetzt["minutes"], " Uhr ";
echo $Jetzt["seconds"], " Sek ";
?>
Selbstverständlich kann man den Index auch mit date("w") angeben. Siehe oben Wochentag als Zahl.
Montag <?php echo $wochentag[date("w")] ?>

gettimeofday()

gettimeofday() liefert ein assosiatives array, wie man es schon von getdate her kennt. Es gibt 4 Elemente. Für die Formatierung wurde die date-Funktion verwendet.

1735575046
583132
-60
0
17:10:46
<?php
$Zeitwerte = gettimeofday();
echo $Zeitwerte("sec"), "<br>";
echo $Zeitwerte("usec"), "<br>";
echo $Zeitwerte("minuteswest"), "<br>";
echo $Zeitwerte("dsttime"), "<br>";
echo date("H:i:s", $Zeitwerte["sec"]);
?>
gettimeofday
Elemente Bedeutung
sec Sekunden
usec Microsekunden
minuteswest zeitliche Abstand zu GMT
dsttime Korrekturfaktor zur Sommerszeit


Rechnen mit Zeitwerten (5 Sekunden warten)
sleep()

Im folgenden Beispiel wird die Systemzeit zu 2 verschiedenen Zeitpunkten ausgelesen und voeinander subtrahiert. Die Funktion sleep() verzögert die folgendenden Anweisungen, um die eingegebenen Sekunden. Die Formatierung mittels date erzeugt immer einen Datumswert.

00:05 <?php
$Start=time();
sleep(5);
$Ende=time();
$Zeit=$Ende-$Start;
echo date("i:s", $Zeit);
?>

Datumsdifferenz berechnen

Im folgenden Beispiel werden 2 Zeitstempel mit mktime() erzeugt.

Dann wird einer vom anderen subtrahiert. Das Ergebnis ist ein weiterer Zeitstempel.

Von diesem werden die Tage ermittelt mit date("z", $diff).

Alternativ könnte man auch die gelieferten Sekunden zu Tagen dividieren.

$diff_tag = $diff_sek / 60 / 60 / 24;

287 Tage date_default_timezone_set('Europe/Amsterdam');
$date1 = mktime(0, 0, 0, 12, 24, 2023);
$date2 = mktime(0, 0, 0, 3, 12, 2023);
$diff_sek = $date1 - $date2;
echo date("z", $diff_sek) . " Tage";
// $diff_tag = $diff_sek / 60 / 60 / 24;

Sekunden in Tage, Stunden, Minuten umrechnen

Im folgenden wird eine Datumsdifferenz berechnet.

date_default_timezone_set('Europe/Amsterdam');
$date1 = mktime(16, 40, 0, 11, 7, 2023);
$date2 = time();
$diff = $date1 - $date2;

Nun werden die Sekunden in Tage, Stunden, Minuten, Sekunden umgerechnet. intval() erzeugt eine Ganzzahl und mittels Modulo erhält man den Restwert einer Division.

Fangen wir mal hinten in der unten stehenden Gleichung an.
Teil man Sekunden durch 60 erhält man Minuten. Mittles intval() erhält man eine Ganzzahl.

intval($diff / 60); //Minuten

Die restlichen Sekunden oder der Restwert der Division wird mit Modulo ermittelt:

$diff % 60; //restliche Sekunden

In der untenstehenden Gleichung sieht es etwas anders aus, dazu später mehr.

Eine Stunde sind 60 Minuten oder 60*60 Sekunden oder 3600 Sekunden. Als Ganzahl ist es:

intval($diff / 3600); //Stunden

Die Restzeit der Stunden in Sekunden wird mit Modulo ermittelt

($diff % 3600)

Diese Sekunden als ganzzahlige Minuten erhält man:

intval(($diff % 3600) / 60); //Minuten

Da man in diesem Beispiel auch noch Tage ermitteln will muss man damit genauso verfahren. Man ermittelt die gesamte Anzahl an Tagen dann davon die Restzeit für die Stunden.

$tage = intval($diff / 86400); // 3600 * 24
$stunden = intval(($diff % 86400) / 3600);
$minuten = intval(($diff % 3600) / 60);
$sekunden = $diff % 60;

    echo "Tage: " . $tage . "<br>";
    echo "Stunden: " . $stunden . "<br>";
    echo "Minuten: " . $minuten . "<br>";
    echo "Sekunden: " . $sekunden . "<br>";

Tage bis Weihnachten

Im folgendem Beispiel werden die Tage bis Weihnachten berechnet. Wenn der jetzige Tag hinter Weihnachten des aktuellen Jahres liegt, werden die Tage bis nächstes Jahr Weihnachten ausgerechnet.

Die Variable $xtag für den Zieltag, und $xmonat für den Zielmonat kann man leicht abändern, um anstatt Weihnachten ein anderes Zieldatum zu errechnen.

$xjahr bekommt das aktuelle Jahr.
$tagj ist der jetzige Tag als sounsovielter Tag des Jahres.
$xmas bekommt das Zieldatum mit mktime() anhand der erstellten Variablen zugewiesen.

Aus diesem Zeitstempel wird der soundsovielte Tag des Jahres in $tagx gespeichert.

In einer if-Struktur wird abgefragt ob der Zieltag kleiner ist als der heutige Tag. Daraus ergibt sich, dass der heutige Tag hinter dem Zieltag in diesem Jahr liegt oder anders ausgedrückt es ist ein Tag nach Weichnachten diesen Jahres ist. Ist das der Fall sollte $xmas einen neuen Zeitstempel bekommen, wobei das Jahr um 1 erhöht wird.

Nun braucht man nur noch einen Zeitstempel für Jetzt $jetzt = time(); damit man diesen vom $xmas subtrahieren kann.
$diff = $xmas - $jetzt;

Aus diesem Ergebnis - Zeitstempel ermittelt man mit date("z",$diff) die Tage des Jahres und gibt sie aus.

     $xtag = 24;
    $xmonat = 12;

    $xjahr = intval(date("Y")); // Y das aktuelle Jahr für den $xmas Zeitstempel
    $tagJ = intval(date("z")); //z der wievielte Tag im Jahr ist jetzt

    $xmas = mktime(0, 0, 0, $xmonat, $xtag, $xjahr); // Zeitstempel für Zieldatum
    $tagX = intval(date("z", $xmas)); //der wievielte Tag im Jahr ist das Zieldatum

    // ist der Tag im Jahr des Zieldatums kleiner als der jetzige Tag,
    //ist das Zieldatum in diesem Jahr schon vorbei
    // dann wird ein neues Zieldatum  für nächstes Jahr erstellt, also, dieses Jahr + 1
    if ($tagX < $tagJ)
        $xmas = mktime(0, 0, 0, $xmonat, $xtag, ($xjahr + 1));

    $jetzt = time();
    $diff = $xmas - $jetzt;

    echo "Bis zum " . date("d.m.Y", $xmas) . " sind es noch " . date("z", $diff) . " Tage";   

Bis zum 24.12.2025 sind es noch 358 Tage

Zeitstempel in Datenbanken

Man kann einem Feld den Typ TIMESTAMP zuweisen mit dem Standartwert current_timestamp. Dann wird bei jedem neuen Datensatz automatisch ein aktueller Zeitstempel erzeugt. So kann man die Datensätze danach sortieren oder filtern. Ein Timestamp hat folgendes Format:

JJJJ-MM-TT HH:MM:SS

24.12. 2023 17 Uhr 30 sähe so aus

2023-12-24 17:30:00

In phpMyAdmin wählte man für das Feld den
Typ: TIMESTAMP
Standardwert: current_timestamp

Zeitstempel formatieren

Wenn man einen Zeitstempel auf der Seite anzeigen und mit der date() Funktion formatieren will, muss man ihn mit strtotime() in einen UNIX-Timestamp konvertieren.

date("d.m.Y / H:i", strtotime($blogTabelle["zeitstempel"]));

SQL Funktionen für Zeitangaben

SQL bietet die Möglichkeit Felder mit Typ TIMESTAMP oder DATE nach bestimmten Kriterien zu durchsuchen oder zu filtern. Es stehen folgende Funktionen zur Verfügung:

YEAR() MONTH() DAYOFMONTH() HOUR() MINUTE() SECOND()

SQL Beispiel

"SELECT FROM personen WHERE MONTH(geburtstag) = 5"

Deutsche Wochentage

Es folgt eine Funktion, die das Datum mit einem deutschen Wochentag ausgibt, als Argument $Datum wird ein gültiger Datumssting erwartet, die Trennzeichen sind frei wählbar
"01.10.05"
"30/10/2005"
oder die date Funktion mit der deutschenFormatangabe Tag.Monat.Jahr
date("d.m.y")

<?php

function Wochentag($Datum) {
$Tage = array ("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
if(is_string($Datum)){
$Tag = (int) substr($Datum, 0, 2);
$Monat = (int) substr($Datum, 3, 2);
$Jahr = (int) substr($Datum, 6, 4);
if(checkdate($Monat, $Tag, $Jahr)){
$Datum = mktime(0, 0, 0, $Monat, $Tag, $Jahr);

$Tag = date("w", $Datum);
$Datum_komplett=$Tage[$Tag].", ". date("d.m.y", $Datum);
return $Datum_komplett;
}
else{
return-1;
}
}
}

?>

Montag, 17.10.05 <?php
echo Wochentag ("17.10.05");
?>
Montag, 17.10.05 <?php
echo Wochentag ("17.10.2005");
?>
Montag, 30.12.24 <?php
echo Wochentag (date("d.m.y"));
?>

Zu Anfang der Funktion Wochentag wird ein Array gebildet, dessen Elemente die deutschen Wochentage bilden. In der folgenden If Struktur wird überprüft, ob das Argument $Datum überhaupt ein string ist. Ist das nicht der Fall, wird gleich eine Fehlermeldung ausgegeben.
Der folgende Teil wurde schon in den beiden vorigen Funktionen erklärt. (siehe oben)

$Tag = date("w", $Datum);
Hier wird mittels der date Funktion ein numerischer Wert für den Wochentag ermittelt, beginnend bei 0 für Sonntag.
$Tage[$Tag]
Dieser Wert wird dann als Index des zu Anfang gebildeten arrays $Tage übergeben.
In $Datum_komplett wird noch das eingebene Datum durch Kommata getrennt an den Wochentag angehängt
$Datum_komplett=$Tage[$Tag].", ". date("d.m.y", $Datum);
siehe date Funktion
Zum Ende wird $Datum_komplett mit return zurückgegeben.


Webdesign / PHP / mySQL / Dreamweaver MX Tipps
Copyright © Michael Albers
www.pastorpixel.de