Der Umgang mit Datums- und Zeitangaben ist eine der Dinge, die Programmierer sehr frustrieren können. Gleichzeitig sind sie grundlegend für die Softwareentwicklung und werden für alles Mögliche verwendet, von Metadaten und der Reihenfolge von Dingen bis hin zu zeitbasierten Triggern und vielem mehr dazwischen.
Daten und Zeiten sind auch fehleranfällig. Wenn Sie sie falsch behandeln, können sie Endbenutzer und Kollegen gleichermaßen verwirren.
Dies ist ein schneller Leitfaden zum Umgang mit Datums- und Zeitangaben speziell in der Programmiersprache PHP. Er soll als Referenz für die häufigsten Bedürfnisse dienen, wie z. B. das Formatieren und Anpassen von Datumsangaben. Er ist einfach, aber er wird wahrscheinlich 80 % Ihrer Bedürfnisse abdecken.
Inhaltsverzeichnis
Diese Recherche wird durch die Unterstützung von Frontend Masters, dem offiziellen Lernpartner von CSS-Tricks, ermöglicht.
Benötigen Sie Training für die Front-End-Entwicklung?
Frontend Masters ist der beste Ort dafür. Sie haben Kurse zu allen wichtigen Frontend-Technologien. Interessiert an Full-Stack? Hier ist Ihre beste Wahl
Aktuelles Datum und aktuelle Uhrzeit abrufen
Eine wichtige Sache, die man wissen sollte, ist, dass Datums- und Zeitangaben in drei Formen dargestellt werden können: ein Zeitstempel (d. h. Epochenzeit), ein DateTime-Objekt und eine Zeichenkette.
Zuerst ein Rezept, um das aktuelle Datum und die aktuelle Uhrzeit abzurufen
<?php
$now = new DateTime();
var_dump($now);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2021-10-13 22:25:11.790490"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
// }
Dies liefert ein DateTime-Objekt, das zur Erstellung einer Datums- und Zeitzeichenkette verwendet werden kann
<?php
$now = new DateTime();
echo $now->format("Y-m-d"); // 2021-10-13
echo $now->format("Y-m-d h:i:s A"); // 2021-10-13 10:10:31 PM
Intuitiv weiß man, dass Y für das Jahr, m für den Monat, d für den Tag des Monats und so weiter steht. Die vollständige Liste der Parameter finden Sie im PHP-Handbuch, aber ich nenne hier einige der gebräuchlichsten als Referenz.
| Tag des Monats | ||
d | Tag des Monats. Zwei Ziffern mit führenden Nullen | 01 - 31 |
j | Tag des Monats ohne führende Nullen | 1 - 31 |
S | Enthält die englische Endung. | st, nd, rd, th (z. B. 1st, 2nd, 3rd, 4th) |
| Wochentag | ||
D | Abgekürzte textuelle Darstellung eines Tages, in drei Buchstaben | So - Sa |
l | Eine vollständige textuelle Darstellung eines Wochentags. | Sonntag - Samstag |
| Monat | ||
F | Eine vollständige textuelle Darstellung eines Monats, wie Januar oder März | Januar - Dezember |
M | Abgekürzte textuelle Darstellung eines Monats, in drei Buchstaben | Jan - Dez |
m | Numerische Darstellung eines Monats mit führenden Nullen | 01 - 12 |
n | Numerische Darstellung eines Monats ohne führende Nullen | 1 - 12 |
| Jahr | ||
Y | Eine vollständige numerische Darstellung eines Jahres, 4 Ziffern | z. B. 1999 oder 2003 |
y | Eine zweistellige Darstellung eines Jahres | z. B. 99 oder 03 |
| Zeit | ||
A | Großbuchstaben Ante Meridiem und Post Meridiem | AM oder PM |
g | 12-Stunden-Format einer Stunde ohne führende Nullen | 1 - 12 |
h | 12-Stunden-Format einer Stunde mit führenden Nullen | 01 - 12 |
i | Minuten mit führenden Nullen | 00 - 59 |
s | Sekunden mit führenden Nullen | 00 - 59 |
Das DateTime-Objekt kann in einen Zeitstempel umgewandelt werden
<?php
$now = new DateTime();
echo $now->getTimestamp(); // 1634139081
Aber wir können auch die aktuelle Zeit als Zeitstempel erhalten, ohne ein DateTime-Objekt zu erstellen
<?php
echo time(); // 1634139081
Ein DateTime-Objekt für eine bestimmte Zeit erstellen
Was ist, wenn wir ein DateTime für eine bestimmte Zeit erstellen wollen, z. B. den 14. Juli 2011? Wir können dem Konstruktor eine formatierte Zeichenkette übergeben
<?php
$date = new DateTime("2011-07-14");
var_dump($date);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2011-07-14 00:00:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
// }
Der Konstruktor akzeptiert auch andere Formate
<?php
$date = new DateTime("14-07-2011");
var_dump($date);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2011-07-14 00:00:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
// }
Aber Vorsicht bei einem mehrdeutigen Format wie diesem
<?php
$date = new DateTime("07/14/2011");
var_dump($date);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2011-07-14 00:00:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
// }
Man könnte denken, dass jeder mit einem amerikanischen Datumsformat vertraut sein sollte. Aber nicht jeder ist es, und es kann unterschiedlich interpretiert werden. PostgreSQL nicht.
CREATE TABLE IF NOT EXISTS public.datetime_demo
(
created_at date
);
insert into datetime_demo (created_at) values ('07/12/2011');
select created_at from datetime_demo; /* 2011-12-07 */
Sie denken vielleicht, dass dies der 12. Juli 2011 ergeben würde, aber stattdessen war es der 7. Dezember 2011. Ein besserer Weg ist die Verwendung eines expliziten Formats
<?php
$date = DateTime::createFromFormat('m/d/y', "10/08/21");
var_dump($date);
//object(DateTime)#2 (3) {
// ["date"]=>
// string(26) "2021-10-08 16:00:47.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
//}
Was ist, wenn wir ein DateTime-Objekt aus einem Zeitstempel erstellen wollen?
<?php
$date = new DateTime();
$date->setTimestamp(1634142890);
var_dump($date);
//object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2021-10-13 23:34:50.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(12) "Asia/Jakarta"
// }
Wir müssen kein DateTime-Objekt erstellen, wenn wir ein Zeitstempel-Objekt in eine formatierte Datumszeichenkette umwandeln wollen
<?php
echo date("Y-m-d h:i A", time()); // 2021-10-14 04:10 PM
Zeitzonen
Wir können ein DateTime-Objekt erstellen, das Zeitzoneninformationen enthält, z. B. wenn wir mit Pacific Standard Time, Eastern Daylight Time usw. arbeiten.
<?php
$timezone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-10-13 05:00", $timezone);
var_dump($date);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2021-10-13 05:00:00.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(16) "America/New_York"
// }
// Eastern Daylight Time, for example: New York
$date = new DateTime("2021-10-13 05:00 EDT");
var_dump($date);
// object(DateTime)#2 (3) {
// ["date"]=>
// string(26) "2021-10-13 05:00:00.000000"
// ["timezone_type"]=>
// int(2)
// ["timezone"]=>
// string(3) "EDT"
// }
$date = new DateTime("2021-10-13 05:00 -04:00");
var_dump($date);
// object(DateTime)#1 (3) {
// ["date"]=>
// string(26) "2021-10-13 05:00:00.000000"
// ["timezone_type"]=>
// int(1)
// ["timezone"]=>
// string(6) "-04:00"
// }
Es gibt drei Möglichkeiten, ein DateTime-Objekt mit Zeitzoneninformationen zu erstellen. Der timezone_type akzeptiert für jeden einzelnen unterschiedliche Werte.
Aber sagen wir, wir wollen ein Datum und eine Uhrzeit, die in der Zeitzone von New York angezeigt werden, in die Zeitzone von Jakarta umwandeln?
<?php
$newYorkTimeZone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-11-11 05:00", $newYorkTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-11-11 05:00 AM
$jakartaTimeZone = new DateTimeZone("Asia/Jakarta");
$date->setTimeZone($jakartaTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-11-11 05:00 PM
Wenn es in New York 5:00 Uhr morgens ist, ist es in Jakarta am selben Tag 17:00 Uhr. Jakarta ist am 11. November 2021 12 Stunden vor New York. Aber einen Monat früher ist Jakarta nur 11 Stunden vor New York, wie unten gezeigt
<?php
$newYorkTimeZone = new DateTimeZone("America/New_York");
$date = new DateTime("2021-10-11 05:00", $newYorkTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-10-11 05:00 AM
$jakartaTimeZone = new DateTimeZone("Asia/Jakarta");
$date->setTimeZone($jakartaTimeZone);
echo $date->format("Y-m-d h:i A"); // 2021-10-11 04:00 PM
PHP kümmert sich automatisch um die Sommerzeit.
Lokalisierung
Dies ist eine gängige Art, Datum und Uhrzeit in den Vereinigten Staaten anzuzeigen
<?php
$now = new DateTime();
echo $now->format("m/d/Y h:i A"); // 10/14/2021 03:00 PM
Aber jemand in Frankreich bevorzugt vielleicht etwas, das in seiner Region üblicher ist. C'est horrible, würden sie sich beschweren. Erstens stellt niemand den Monat vor den Tag des Monats, außer den USA. Zweitens verwendet Frankreich kein AM oder PM – sie verwenden das 24-Stunden-Format (z. B. 14:00 Uhr statt 14:00 Uhr) wie das Militär. So machen Sie einen Franzosen glücklich.
<?php
$now = new DateTime();
echo $now->format("d/m/Y H:i"); // 14/10/2021 15:00
Aber das erfordert intime Kenntnisse über ein bestimmtes Land oder Gebiet. Stattdessen können wir das Datum lokalisieren. Um ein Datum zu lokalisieren, müssen wir die Internationalisierungsunterstützung für PHP installieren. Unter Ubuntu können wir diesen Schritt durchführen
$ sudo apt-get install php-intl
Um ein Datum und eine Uhrzeit auf Französisch anzuzeigen, können wir IntlDateFormatter verwenden
$locale = "fr_FR.UTF-8";
$formatter = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::SHORT, "Asia/Singapore");
$date = new DateTime("2020-10-10 00:00 UTC");
echo $formatter->format($date); // samedi 10 octobre 2020 à 08:00
Sie übergeben das französische Gebietsschema als ersten Parameter von IntlDateFormatter.
Der zweite Parameter ist das Format für das Datum. Der dritte Parameter ist das Format für die Uhrzeit. Die Zeitzone für die Anzeige von Datum und Uhrzeit ist im vierten Parameter.
Neben IntlDateFormatter::FULL und IntlDateFormatter::SHORT sind weitere beliebte Formate IntlDateFormatter::NONE, IntlDateFormatter::LONG,
und IntlDateFormatter::MEDIUM.
Wenn Sie IntlDateFormatter::NONE für die Uhrzeit oder im dritten Parameter verwenden, bedeutet dies, dass Sie die Uhrzeit nicht in das Format aufnehmen
$locale = "fr_FR.UTF-8";
$formatter = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE, "Asia/Singapore");
$date = new DateTime("2020-10-10 00:00 UTC");
echo $formatter->format($date); // 10 octobre 2020
Zeitreisen
Lassen Sie uns Zeitreisen in die Vergangenheit und die Zukunft machen. Zuerst machen wir uns mit DateInterval vertraut
<?php
$interval = new DateInterval("P4M1W2DT2H5M");
// P 4M 1W 2D T 2H 5M
//
// P = Period interval (years, months, weeks, days)
// 4M = 4 months
// 1W = 1 week
// 2D = 2 days
//
// T = Time interval (hours, minutes, seconds)
// 2H = 2 hours
// 5M = 5 minutes
Die Buchstaben P und T dienen zur Trennung von Zeitintervallen und Zeitintervallen. Hier ist, wie wir in die Zukunft reisen können
<?php
$date = new DateTime("2021-10-14");
$interval = new DateInterval("P2D"); // 2 days
$futureDate = $date->add($interval);
echo $futureDate->format("Y-m-d"); // 2021-10-16
Und hier reisen wir zurück in die Zeit
<?php
$date = new DateTime("2021-10-14 10:00");
$interval = new DateInterval("PT6H"); // 6 hours
$pastDate = $date->sub($interval);
echo $pastDate->format("Y-m-d H:i"); // 2021-10-14 04:00
Wenn wir mit dem Namen des Wochentags in die Zeit reisen wollen, können wir die Funktion strtotime() und die Methode setTimestamp() eines DateTime-Objekts kombinieren
<?php
$nextTuesday = strtotime("next tuesday");
$date = new DateTime("2021-10-14");
$date->setTimestamp($nextTuesday);
echo $date->format("Y-m-d"); // 2021-10-19
Die vollständige Liste der strtotime()-Parameter finden Sie in der PHP-Dokumentation.
Wiederkehrende Daten und Zeiten
In Kalender-Apps ist es üblich, eine Erinnerung einzustellen, die sich in bestimmten Abständen wiederholt, z. B. alle zwei Tage oder jede Woche. Wir können DatePeriod verwenden, um eine Zeitspanne darzustellen
<?php
$start = new DateTime("2021-10-01");
$end = new DateTime("2021-11-01");
$interval = new DateInterval("P1W"); // 1 week
$range = new DatePeriod($start, $interval, $end);
// Starting from October 1st 2021 (inclusive), jump every 1 week
// until November 1st 2021 (exclusive)
foreach ($range as $date) {
echo $date->format("Y-m-d") . "n";
}
// 2022-10-01
// 2022-10-08
// 2022-10-15
// 2022-10-22
// 2022-10-29
Wie viele Tage her?
Sie wissen, wie Dienste wie Twitter anzeigen, dass jemand vor X Minuten/Stunden/Tagen/usw. gepostet hat? Wir können dasselbe tun, indem wir berechnen, wie viel Zeit zwischen der aktuellen Zeit und dem Zeitpunkt, an dem die Aktion stattgefunden hat, vergangen ist.
<?php
$date = new DateTime("2022-10-30");
$date2 = new DateTime("2022-10-25");
$date3 = new DateTime("2022-10-10");
$date4 = new DateTime("2022-03-30");
$date5 = new DateTime("2020-03-30");
function get_period_ago($endDate, $startDate) {
$dateInterval = $endDate->diff($startDate);
if ($dateInterval->invert==1) {
if ($dateInterval->y > 0) {
return $dateInterval->y . " years agon";
} if ($dateInterval->m > 0) {
return $dateInterval->m . " months agon";
} if ($dateInterval->d > 7) {
return (int)($dateInterval->d / 7) . " weeks agon";
} if ($dateInterval->d > 0) {
return $dateInterval->d . " days agon";
}
}
}
echo get_period_ago($date, $date2); // 5 days ago
echo get_period_ago($date, $date3); // 2 weeks ago
echo get_period_ago($date, $date4); // 7 months ago
echo get_period_ago($date, $date5); // 2 years ago
Nachdem Sie das DateInterval-Objekt von der diff()-Methode erhalten haben, stellen Sie sicher, dass die Variable $startDate in der Vergangenheit liegt, indem Sie die Eigenschaft invert überprüfen. Prüfen Sie dann die Eigenschaften y, m und d.
Die vollständige Liste der Eigenschaften des DateInterval-Objekts finden Sie hier in der PHP-Dokumentation.
Wo geht es von hier aus weiter?
Jetzt haben Sie einen kleinen Spickzettel mit häufigen PHP-Rezepten für den Fall, dass Sie mit Datums- und Zeitangaben arbeiten. Müssen Sie das aktuelle Datum und die aktuelle Uhrzeit abrufen? Vielleicht müssen Sie ein Datum auf eine bestimmte Weise formatieren, die lokale Zeitzone einschließen oder Datumsangaben vergleichen. All das finden Sie hier!
Es gibt natürlich noch mehr Methoden und Funktionen für Datum und Uhrzeit, die wir nicht besprochen haben – Dinge wie kalenderbezogene Funktionen und dergleichen. Halten Sie den Abschnitt Datum und Uhrzeit des PHP-Handbuchs griffbereit für noch mehr Anwendungsfälle und Beispiele.
Mann, ich bin seit 20 Jahren PHP-Programmierer und kannte die DateInterval gar nicht!!!
Ich glaube, ich habe mich an Carbon gewöhnt, und ich wette, dass sie diese Funktionen intern verwenden!
Danke für den Artikel!
Carbon erleichtert die Handhabung von Datum und Uhrzeit und bietet zusätzliche Funktionalität.
Entschuldigung, ich muss nur ein bisschen über diese Zeile kichern: „Man könnte denken, dass jeder mit einem amerikanischen Datumsformat vertraut sein sollte.“
Ich denke, jeder weiß, dass Amerikaner Datumsangaben komisch formatieren, aber das bedeutet nicht, dass wir bei den Details nicht unklar sind.
Ich wünschte, ich hätte diesen Artikel vor etwa 15 Jahren gehabt! Das Einzige, was meiner Meinung nach fehlt, ist ->modify(). Zum Beispiel ->modify('+ 1 Day')
Ich bin überrascht zu sehen, dass keine Erwähnung von strftime gemacht wurde, das unter Windows nicht funktioniert und in PHP 8.1 als veraltet gilt.
Vielen Dank für das Feedback! Ich bin der Autor dieses Artikels. Ich werde versuchen, die veraltete Funktion in diesem Artikel zu ersetzen. Aber da jetzt das Jahresende ist, müssen wir möglicherweise bis zu einer Aktualisierung im Januar 2022 warten.