PHP Date and Time Recipes

Arjuna Sky Kok - 18. Nov 2021

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
dTag des Monats. Zwei Ziffern mit führenden Nullen01 - 31
jTag des Monats ohne führende Nullen1 - 31
SEnthält die englische Endung.st, nd, rd, th (z. B. 1st, 2nd, 3rd, 4th)
Wochentag
DAbgekürzte textuelle Darstellung eines Tages, in drei BuchstabenSo - Sa
lEine vollständige textuelle Darstellung eines Wochentags.Sonntag - Samstag
Monat
FEine vollständige textuelle Darstellung eines Monats, wie Januar oder MärzJanuar - Dezember
MAbgekürzte textuelle Darstellung eines Monats, in drei BuchstabenJan - Dez
mNumerische Darstellung eines Monats mit führenden Nullen01 - 12
nNumerische Darstellung eines Monats ohne führende Nullen1 - 12
Jahr
YEine vollständige numerische Darstellung eines Jahres, 4 Ziffernz. B. 1999 oder 2003
yEine zweistellige Darstellung eines Jahresz. B. 99 oder 03
Zeit
AGroßbuchstaben Ante Meridiem und Post MeridiemAM oder PM
g12-Stunden-Format einer Stunde ohne führende Nullen1 - 12
h12-Stunden-Format einer Stunde mit führenden Nullen01 - 12
iMinuten mit führenden Nullen00 - 59
sSekunden mit führenden Nullen00 - 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.