Mit Hilfe der Funktion time() bekommt man den Unix-Timestamp, der sich mit anderen Funktionen ( strftime() ) weiterverarbeiten lässt. Mit der Funktion date() kann man das Datum direkt als String formatiert abrufen.
MySQL verarbeitet Datumsangaben im ISO-8601-Format (siehe die Abhandlung von Markus Kuhn zu diesem Thema). Dies ist das offizielle deutsche Datumsformat, eine Umwandlung ist nicht notwendig, weil nicht normgerecht.
Dennoch kann man das Datum auch in anderen Formaten bekommen. Wahlweise kann die Umwandlung bereits in MySQL oder erst in PHP geschehen. In MySQL kann man mit Hilfe der Funktion date_format das Datum in beliebigen Formaten bekommen:
mysql> SELECT date_format(changed, '%d.%m.%Y %H:%i:%s') AS datum
-> FROM teiln_liste;
+---------------------+
| datum |
+---------------------+
| 27.08.1998 12:49:29 |
| 14.12.1999 15:05:52 |
| 13.12.1999 08:30:43 |
| 13.05.1998 15:51:45 |
| 06.10.1998 14:30:25 |
| 07.08.1998 11:28:59 |
| 23.06.1998 17:15:16 |
| 14.01.1999 08:34:22 |
| 07.01.2000 11:36:42 |
| 01.02.1999 08:47:25 |
+---------------------+
10 rows in set (0.00 sec)
In PHP kann man mit Hilfe der Funktion date() aus einem time_t ein beliebiges Datum generieren und mit Hilfe der Funktion mktime() aus den Fragmenten einer Datumsangabe einen time_t erzeugen. Mit den time_t (Sekunden seit Mitternacht GMT, 1. Januar 1970) lassen sich sehr natürlich Zeitdifferenzen bestimmen und andere Zeitrechnungen ausführen.
Will man dagegen nur einen MySQL TIMESTAMP oder DATE in andere Reihenfolge umsortieren, kann man stattdessen mit den Funktionen explode() oder substr() arbeiten.
/**
* date_mysql2german
* wandelt ein MySQL-DATE (ISO-Date)
* in ein traditionelles deutsches Datum um.
*/
function date_mysql2german($datum) {
list($jahr, $monat, $tag) = explode("-", $datum);
return sprintf("%02d.%02d.%04d", $tag, $monat, $jahr);
}
/**
* date_german2mysql
* wandelt ein traditionelles deutsches Datum
* nach MySQL (ISO-Date).
*/
function date_german2mysql($datum) {
list($tag, $monat, $jahr) = explode(".", $datum);
return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);
}
/**
* timestamp_mysql2german
* wandelt ein MySQL-Timestamp
* in ein traditionelles deutsches Datum um.
*/
function timestamp_mysql2german($t) {
return sprintf("%02d.%02d.%04d",
substr($t, 6, 2),
substr($t, 4, 2),
substr($t, 0, 4));
}
Dazu gibt es verschiedene Lösungsansätze. Beispielsweise kann man beide Daten in Julianische Tage verwandeln und sie dann voneinander subtrahieren. Das geschieht mit der Funktion GregorianToJD() aus der optionalen Kalenderbibliothek von PHP (muss erst kompiliert werden).
Antwort von Alex Kiesel:Eine zweite Möglichkeit ist, die Datumsangaben in Unix-Timestamps umzuwandeln, mit denen die Differenz durch einfache Substraktion ermittelt werden kann. Unix Timestamps geben eine Zeit als die Anzahl der vergangenen Sekunden seit dem Beginn der Unix Epoche an. Folgender Code demonstriert das:
$utimeDatum1= mktime(0, 0, 0, 1, 1, 2000); // 1. Januar 2000
$utimeDatum2= time (); // Jetzt
$diff= $utimeDatum2 - $utimeDatum1;
printf ("Seit dem %s sind %d Tage bis heute vergangen\n",
date ('d.m.Y', $utimeDatum1),
($diff / 86400)
);
Der Nachteil am Rechnen mit Unix-Timestamps besteht darin, dass man nicht mit Daten vor dem 13.12.1901, 20:45:54 GMT und Daten nach dem 19.01.2038 03:14:07 GMT rechnen kann; zudem unterstützen manche verschiedenen Linux- und Windowssystemen Probleme keine Daten im negativen (Integer-)Bereich, also vor dem 1.1.1970.
Wenn man date() und mktime() kombiniert, kann man Datumsberechnungen durchführen. Die Funktion mktime() berechnet automatisch den korrekten Wert für Überläufe - der 32.12.1997 wird richtig in 01.01.1998 umgewandelt. So erhält man also auch das Datum des Vortages:
$tstamp = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
$gestern = date("Y-m-d", $tstamp); // ISO-8601 Format
print $gestern;
Beachte: Die Reihenfolge der Parameter in der PHP-Funktion mktime() entspricht nicht der Reihenfolge der Parameter in der C-Funktion gleichen Namens.
date() versteht die Option "t", die die Anzahl der Tage im Monat zurückliefert:
$tage = date("t");
Mit der Funktion setlocale() kann man diverse Länder- und sprachabhängigen Einstellungen vornehmen. Die Sprache wird im Format Sprache_Land bzw. Sprache_Land.Codepage angegeben und ist plattformabhängig; unter Unix/Linux sind zweibuchstabige Länderabkürzungen zu verwenden, also z.B. de_DE für Deutsch/Deutschland oder de_AT für Deutsch/Österreich, Windows dagegen erwartet German_Germany bzw. German_Austria . Die Einstellung für die Kategorie LC_TIME wirkt sich nur auf die Ausgabe von strftime() , nicht jedoch auf date() aus.
<?php
// Default
echo strftime('%A, %d. %B %Y', 1009926000);
// Ausgabe: Wednesday, 02. January 2002
Linux: setlocale(LC_TIME, 'de_DE');
*BSD: setlocale(LC_TIME, 'de_DE.ISO_8859-1');
Win: setlocale(LC_TIME, 'German_Germany');
echo strftime('%A, %d. %B %Y', 1009926000);
// Ausgabe: Mittwoch, 02. Januar 2002
Linux: setlocale(LC_TIME, 'de_AT');
*BSD: setlocale(LC_TIME, 'de_AT.ISO_8859-1');
Win: setlocale(LC_TIME, 'German_Austria');
echo strftime('%A, %d. %B %Y', 1009926000);
// Ausgabe: Mittwoch, 02. Jänner 2002
?>
Um zu testen, ob ein bestimmter locale-String auf einem System unterstützt wird, kann man den Rückgabewert von setlocale() auswerten:
if (setlocale(...) === false) // dann hat's nicht funktioniert
Warnung: setlocale() ist nicht thread-safe, d.h. die Einstellungen wirken sich in Multithread-Umgebungen u.U. auch auf andere, parallel laufende Scripte aus!