DateTimeInterface::format

DateTimeImmutable::format

DateTime::format

date_format

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DateTimeInterface::format -- DateTimeImmutable::format -- DateTime::format -- date_formatLiefert das Datum formatiert gemäß dem angegebenen Format

Beschreibung

Objektorientierter Stil

public DateTimeInterface::format(string $format): string
public DateTimeImmutable::format(string $format): string
public DateTime::format(string $format): string

Prozeduraler Stil

Gibt das Datum im angegebenen Format zurück.

Parameter-Liste

object

Nur bei prozeduralem Aufruf: Ein von date_create() zurückgegebenes DateTime-Objekt.

format

Das Format des ausgegebenen Datums vom Typ string. Siehe die Formatierungsoptionen unten. Es gibt auch mehrere vordefinierte Datumskonstanten, die stattdessen verwendet werden können, z. B. enthält DATE_RSS die Formatzeichenkette 'D, d M Y H:i:s'.

Die folgenden Zeichen werden in der Parameterzeichenkette format erkannt
format-Zeichen Beschreibung Mögliche Rückgabewerte
Tag --- ---
d Tag des Monats; zwei Ziffern mit vorangestellter Null 01 bis 31
D Textuelle Darstellung eines Tages; drei Buchstaben Mon bis Sun
j Tag des Monats; zwei Ziffern ohne vorangestellte Null 1 bis 31
l (kleines 'L') Vollständige textuelle Darstellung eines Tages Sunday bis Saturday
N Numerische Darstellung eines Wochentags gemäß ISO-8601 1 (für Montag) bis 7 (für Sonntag)
S Englisches Ordnungssuffix für den Tag des Monats; zwei Buchstaben st, nd, rd oder th; funktioniert gut mit j
w Numerische Darstellung eines Wochentags 0 (für Sonntag) bis 6 (für Samstag)
z Tag des Jahres (beginnend bei 0) 0 bis 365
Woche --- ---
W Wochennummer eines Jahres gemäß ISO-8601; die Wochen beginnen am Montag Beispiel: 42 (die 42. Woche des Jahres)
Monat --- ---
F Vollständige textuelle Darstellung eines Monats, z. B. January oder March January bis December
m Numerische Darstellung eines Monats; mit vorangestellter Null 01 bis 12
M Kurze textuelle Darstellung eines Monats; drei Buchstaben Jan bis Dec
n Numerische Darstellung eines Monats; ohne vorangestellte Null 1 bis 12
t Anzahl der Tage des angegebenen Monats 28 bis 31
Jahr --- ---
L Gibt an, ob es ein Schaltjahr ist 1 wenn es ein Schaltjahr ist, andernfalls 0
o Jahreszahl gemäß ISO 8601-Wochennummer. Dies hat den gleichen Wert wie Y, außer wenn die ISO-Wochennummer (W) zum vorherigen oder nächsten Jahr gehört; dann wird stattdessen das Jahr dieser Woche verwendet. Beispiele: 1999 oder 2003
X Erweiterte vollständige numerische Darstellung einer Jahreszahl, mindestens 4-stellig, mit - für Jahre vor Christus und + für Jahre nach Christus. Beispiele: -0055, +0787, +1999, +10191
x Erweiterte vollständige numerische Darstellung einer Jahreszahl, falls erforderlich, oder standardmäßige vollständige numerische Darstellung, falls möglich (wie Y). Mindestens vier Ziffern. Jahren vor Christi Geburt wird ein - vorangestellt. Jahreszahlen über (und einschließlich) 10000 werden mit einem + eingeleitet. Beispiele: -0055, 0787, 1999, +10191
Y Vollständige numerische Darstellung einer Jahreszahl; mindestens vier Ziffern, mit - für die Jahre vor Christus Beispiele: -0055, 0787, 1999, 2003, 10191
y Darstellung einer Jahreszahl; zwei Ziffern Beispiele: 99 oder 03
Zeit --- ---
a Ante meridiem und Post meridiem in Kleinbuchstaben am oder pm
A Ante meridiem und Post meridiem in Großbuchstaben AM oder PM
B Swatch-Internetzeit 000 bis 999
g Stunde im 12-Stunden-Format; ohne vorangestellte Null 1 bis 12
G Stunde im 24-Stunden-Format; ohne vorangestellte Null 0 bis 23
h Stunde im 12-Stunden-Format; mit vorangestellter Null 01 bis 12
H Stunde im 24-Stunden-Format; mit vorangestellter Null 00 bis 23
i Minuten; mit vorangestellter Null 00 bis 59
s Sekunden; mit vorangestellter Null 00 bis 59
u Mikrosekunden. Es ist zu beachten, dass die Funktion date() immer 000000 ausgibt, weil sie einen Parameter vom Typ int erwartet, während DateTime::format() Mikrosekunden unterstützt, wenn DateTime mit Mikrosekunden erstellt wurde. Beispiel: 654321
v Millisekunden. Es gilt der gleiche Hinweis wie für u. Beispiel: 654
Zeitzone --- ---
e Bezeichner der Zeitzone Beispiele: UTC, GMT, Atlantic/Azores
I (großes i) Gibt an, ob das Datum in der Sommerzeit liegt oder nicht 1 für Sommerzeit, andernfalls 0
O Differenz zur Greenwich-Zeit (GMT); ohne Doppelpunkt zwischen Stunden und Minuten Beispiel: +0200
P Differenz zur Greenwich-Zeit (GMT); mit Doppelpunkt zwischen Stunden und Minuten Beispiel: +02:00
p Dasselbe wie P, gibt aber Z zurück anstelle von +00:00 (verfügbar seit PHP 8.0.0) Beispiele: Z oder +02:00
T Zeitzonenkürzel, falls bekannt; andernfalls die Abweichung von der GMT Beispiele: EST, MDT, +05
Z Zeitverschiebung in Sekunden. Der Wert ist für Zeitzonen westlich von der UTC immer negativ und für die Zeitzonen östlich von der UTC immer positiv. -43200 bis 50400
Datum und Uhrzeit vollständig --- ---
c Datum gemäß ISO 8601 2004-02-12T15:19:21+00:00
r Datum im Format » RFC 2822/» RFC 5322 Beispiel: Thu, 21 Dec 2000 16:01:07 +0200
U Sekunden seit der Unix-Epoche (1. Januar 1970 00:00:00 GMT) Siehe auch time()

In der Formatzeichenkette nicht erkannte Zeichen werden unverändert ausgegeben. In Verbindung mit der Funktion gmdate() gibt das Format Z immer 0 zurück.

Hinweis:

Da diese Funktion nur Zeitstempel vom Typ int akzeptiert, ist das Formatzeichen u nur dann nützlich, wenn die Funktion date_format() mit benutzerdefinierten Zeitstempeln verwendet wird, die mit date_create() erstellt wurden.

Rückgabewerte

Gibt bei Erfolg eine Zeichenkette mit dem formatierten Datum zurück.

Changelog

Version Beschreibung
8.2.0 Die format-Zeichen X und x wurden hinzugefügt.
8.0.0 Vor dieser Version wurde bei einem Fehler false zurückgegeben.

Beispiele

Beispiel #1 DateTimeInterface::format()-Beispiel

Objektorientierter Stil

<?php
$date
= new DateTimeImmutable('2000-01-01');
echo
$date->format('Y-m-d H:i:s');
?>

Prozeduraler Stil

<?php
$date
= date_create('2000-01-01');
echo
date_format($date, 'Y-m-d H:i:s');
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

2000-01-01 00:00:00

Beispiel #2 Weitere Beispiele

<?php
// Die Standard-Zeitzone setzen, die verwendet werden soll.
date_default_timezone_set('UTC');

// Jetzt
$date = new DateTimeImmutable();

// Gibt z.&nbsp;B. Folgendes aus: Wednesday
echo $date->format('l'), "\n";

// Gibt z.&nbsp;B. Folgendes aus: Wednesday 19th of October 2022 08:40:48 AM
echo $date->format('l jS \o\f F Y h:i:s A'), "\n";

/* Verwenden von Konstanten im Format-Parameter */
// Gibt z.&nbsp;B. Folgendes aus: Wed, 19 Oct 2022 08:40:48 +0000
echo $date->format(DateTimeInterface::RFC2822), "\n";
?>

Um zu verhindern, dass ein bekanntes Zeichen in der Formatzeichenkette interpretiert wird, kann es mit einem vorangestellten Backslash maskiert werden. Wenn das Zeichen mit dem Backslash bereits eine spezielle Zeichenfolge ist, muss eventuell auch der Backslash maskiert werden.

Beispiel #3 Zeichen beim Formatieren maskieren

<?php
$date
= new DateTimeImmutable();

// Gibt z.&nbsp;B. Folgendes aus: Wednesday the 19th
echo $date->format('l \t\h\e jS');
?>

Um Daten in anderen Sprachen zu formatieren, kann IntlDateFormatter::format() anstelle von DateTimeInterface::format() verwendet werden.

Anmerkungen

Diese Methode verwendet keine Gebietsschemata; die gesamte Ausgabe erfolgt auf englisch.

Siehe auch

  • date() - Formatiert einen Unix-Zeitstempel
add a note add a note

User Contributed Notes 10 notes

up
112
craig dot constable at gmail dot com
12 years ago
Using a datetime field from a mysql database e.g. "2012-03-24 17:45:12"

<?php

$result
= mysql_query("SELECT `datetime` FROM `table`");
$row = mysql_fetch_row($result);
$date = date_create($row[0]);

echo
date_format($date, 'Y-m-d H:i:s');
#output: 2012-03-24 17:45:12

echo date_format($date, 'd/m/Y H:i:s');
#output: 24/03/2012 17:45:12

echo date_format($date, 'd/m/y');
#output: 24/03/12

echo date_format($date, 'g:i A');
#output: 5:45 PM

echo date_format($date, 'G:ia');
#output: 05:45pm

echo date_format($date, 'g:ia \o\n l jS F Y');
#output: 5:45pm on Saturday 24th March 2012

?>
up
36
soul dot enforcer at gmail dot com
10 years ago
For full reference of the supported format character and results,
see the documentation of date() :
http://www.php.net/manual/en/function.date.php
up
15
mesa dot fx at gmail dot com
5 years ago
There is a bit confusing logic may appear using year week number:

<?php
echo (new \DateTime("2018-12-31 13:05:21"))->format("YW") . PHP_EOL;
?>

will output 201801, not 201901 nor 201852, because of strange ISO_8601-2004 standard: the  first  calendar  week  of  a  year  is  that  one  which  includes  the  first  Thursday  of  that  year, so this date (it is Monday) do belong to the first week of 2019 (this is why 'W' format gives 01), but internal timestamp is of 2018 (and 'Y' format obey this), therefore getting us unexpected result of 201801. So be careful when using this output with something important (i know projects where this was used to form MySQL partitions).
up
14
sparcbr at gmail dot com
4 years ago
To add literal characteres youi can escape with backslash (\):

$date = new DateTime();
echo $date->format('Ymd\Thms');
up
34
daysnine at gmail dot com
11 years ago
Seems like datetime::format does not really support microseconds as the documentation under date suggest it will.

Here is some code to generate a datetime with microseconds and timezone:

private function udate($format = 'u', $utimestamp = null) {
        if (is_null($utimestamp))
            $utimestamp = microtime(true);

        $timestamp = floor($utimestamp);
        $milliseconds = round(($utimestamp - $timestamp) * 1000000);

        return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
    }

echo udate('Y-m-d H:i:s.u T');
// Will output something like: 2014-01-01 12:20:24.42342 CET
up
-4
tuxedobob
4 years ago
I'm actually not sure whether this is a bug, but here's something that tripped me up on PHP 7.3.

I have a date that looks like this: 'November 3, 2020 11:13 (CST)'

I tried to format it using this format string: 'F j, Y H:i (T)'

That didn't work.

What *did* work was the format string without the parentheses: 'F j, Y H:i T'.

This string also parsed the timezone when the time zone *didn't* have parentheses surrounding it: 'November 3, 2020 11:13 CST'.

It seems as though the T token is a little greedy with surrounding parentheses, so don't include them in your format string.
up
-15
ca at agercon dot dk
13 years ago
The date_format can be use to get the last day of February:

<?php

function last_day_of_feb ($year) {
# The 0th day of a month is the same as the last day of the month before
       
$ultimo_feb_str = $year . "-03-00";
       
$ultimo_feb_date = date_create($ultimo_feb_str);
       
$return = date_format($ultimo_feb_date, "Y-m-d");
        return
$return;
}

echo
last_day_of_feb(2011) . "\n"; # 2011-02-28
echo last_day_of_feb(2012) . "\n"; # 2011-02-29

?>
up
-32
prussell at cloudworksconsulting dot com
10 years ago
The udate function is a great start, but the formatting of the milliseconds is a little off. If it is within the first 100000 microseconds then the string will be less than 6 characters, so 0.012435 will appear as 0.12345. The revision below fixes this.

function udate($strFormat = 'u', $uTimeStamp = null)
{

    // If the time wasn't provided then fill it in
    if (is_null($uTimeStamp))
    {
        $uTimeStamp = microtime(true);
    }

    // Round the time down to the second
    $dtTimeStamp = floor($uTimeStamp);

    // Determine the millisecond value
    $intMilliseconds = round(($uTimeStamp - $dtTimeStamp) * 1000000);
    // Format the milliseconds as a 6 character string
    $strMilliseconds = str_pad($intMilliseconds, 6, '0', STR_PAD_LEFT);

    // Replace the milliseconds in the date format string
    // Then use the date function to process the rest of the string
    return date(preg_replace('`(?<!\\\\)u`', $strMilliseconds, $strFormat), $dtTimeStamp);
}
up
-19
info at ibusweb dot com
5 years ago
$saved_time="2019-03-09 14:25:20";
    $formated_saved_time = new DateTime($saved_time);
    $current_time = new DateTime();
    $interval = $current_time->diff($formated_saved_time);
 
      if (!empty($interval->format('%a'))){
       $time_difference=$interval->format('%a days ago');
        } elseif ($formated_saved_time->format('d') != $current_time->format('d')){
             $time_difference="yesterday";
             }elseif (!empty($interval->format('%h'))){
                     $time_difference=$interval->format('%h hr, %i min ago');
                     } elseif (!empty($interval->format('%i'))){
                              $time_difference=$interval->format('%i min ago');
                              } elseif (!empty($interval->format('%s'))){
                                $time_difference=$interval->format('%s sec ago');
  }

output ----- posted 4 hr, 12 min ago at 2019-03-09 14:25:20

see the code in action here
https://eval.in/1081921
up
-55
chris at codewiz dot biz
10 years ago
I believe this is a bug but its note-worthy if it is intended (I am using PHP 5.5.3).

$ php --version

PHP Warning:  Module 'xdebug' already loaded in Unknown on line 0
PHP 5.5.3-1ubuntu2.1 (cli) (built: Dec 12 2013 04:24:35)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
    with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies

What is happening:

DateTime()->format() will modify the timezone. So do not expect the public date property to be returned (format mask applied) based on the current public timezone property. format will decide that when calling ->format() it will use the server timezone which eliminates all usefulness of ->setTimezone().

<?php
            $nowUtc
= new \DateTime( 'now',  new \DateTimeZone( 'UTC' ) );
            echo
'$nowUtc'.PHP_EOL;
           
var_dump($nowUtc);
           
$nowUtc = new \DateTime( 'now',  new \DateTimeZone( 'UTC' ) );
            echo
'$nowUtc->format(\'Y-m-d h:i:s\')'.PHP_EOL;
           
var_dump($nowUtc->format('Y-m-d h:i:s'));
           
$nowUtc->setTimezone( new \DateTimeZone( 'Australia/Sydney' ) );
            echo
'$nowUtc->setTimezone( new \DateTimeZone( \'Australia/Sydney\' ) )'.PHP_EOL;
           
var_dump($nowUtc);
            echo
'$nowUtc->format(\'Y-m-d h:i:s\')'.PHP_EOL;
           
var_dump($nowUtc->format('Y-m-d h:i:s'));exit;
?>

outputs;

$nowUtc

object(DateTime)[2607]
  public 'date' => string '2014-02-13 02:42:48' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

$nowUtc->format('Y-m-d h:i:s')

string '2014-02-13 02:42:48' (length=19)

$nowUtc->setTimezone( new \DateTimeZone( 'Australia/Sydney' ) )

object(DateTime)[2608]
  public 'date' => string '2014-02-13 13:42:48' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Australia/Sydney' (length=16)

$nowUtc->format('Y-m-d h:i:s')

string '2014-02-13 01:42:48' (length=19) // expected 2014-02-13 13:42:48 based on Australia/Sydney - what is 2014-02-13 01:42:48 from anyway!
To Top