format_datetime
The format_datetime filter formats a date time:
1 2
{# Aug 7, 2019, 11:39:12 PM #}
{{ '2019-08-07 23:39:12'|format_datetime() }}
Note
The format_datetime filter is part of the IntlExtension which is not
installed by default. Install it first:
1
$ composer require twig/intl-extra
Then, on Symfony projects, install the twig/extra-bundle:
1
$ composer require twig/extra-bundle
Otherwise, add the extension explicitly on the Twig environment:
1 2 3 4
use Twig\Extra\Intl\IntlExtension;
$twig = new \Twig\Environment(...);
$twig->addExtension(new IntlExtension());
Format
You can tweak the output for the date part and the time part:
1 2 3 4 5 6 7 8
{# 23:39 #}
{{ '2019-08-07 23:39:12'|format_datetime('none', 'short', locale: 'fr') }}
{# 07/08/2019 #}
{{ '2019-08-07 23:39:12'|format_datetime('short', 'none', locale: 'fr') }}
{# mercredi 7 août 2019 23:39:12 UTC #}
{{ '2019-08-07 23:39:12'|format_datetime('full', 'full', locale: 'fr') }}
Supported values are: none, short, medium, long, and full.
When no pattern is provided, each omitted format uses the corresponding
application default, or medium when none
is configured.
3.6
relative_short, relative_medium, relative_long, and relative_full are also supported when running on
PHP 8.0 and superior or when using a polyfill that define the IntlDateFormatter::RELATIVE_* constants and
associated behavior.
For greater flexibility, you can even define your own pattern (see the ICU user guide for supported patterns).
1 2
{# 11 o'clock PM, GMT #}
{{ '2019-08-07 23:39:12'|format_datetime(pattern: "hh 'oclock' a, zzzz") }}
When no pattern, date format or time format is provided, Twig uses the application default pattern, if any.
Locale
By default, the filter uses the application default locale, or the current locale when none is configured. You can override it explicitly:
1 2
{# 7 août 2019 23:39:12 #}
{{ '2019-08-07 23:39:12'|format_datetime(locale: 'fr') }}
Calendar
By default, the filter uses the application default calendar, or the Gregorian calendar when none is configured. You can override it explicitly:
1 2 3 4
{{ '2019-08-07 23:39:12'|format_datetime(
calendar: 'traditional',
locale: 'th_TH',
) }}
Timezone
By default, the date is displayed by applying the default timezone (the one specified in php.ini or declared in Twig -- see below), but you can override it by explicitly specifying a timezone:
1
{{ datetime|format_datetime(locale: 'en', timezone: 'Pacific/Midway') }}
If the date is already a DateTime object, and if you want to keep its current
timezone, pass false as the timezone value:
1
{{ datetime|format_datetime(locale: 'en', timezone: false) }}
The default timezone can also be set globally by calling setTimezone():
1 2
$twig = new \Twig\Environment($loader);
$twig->getExtension(\Twig\Extension\CoreExtension::class)->setTimezone('Europe/Paris');
Note
The format_datetime filter is part of the IntlExtension which is not
installed by default. Install it first:
1
$ composer require twig/intl-extra
Then, on Symfony projects, install the twig/extra-bundle:
1
$ composer require twig/extra-bundle
Otherwise, add the extension explicitly on the Twig environment:
1 2 3 4
use Twig\Extra\Intl\IntlExtension;
$twig = new \Twig\Environment(...);
$twig->addExtension(new IntlExtension());
Configure Defaults
You can configure the locale, formats and calendar once for all date and time
filters by passing an IntlDateFormatter when registering the extension:
1 2 3 4 5 6 7 8 9 10 11 12
use Twig\Extra\Intl\IntlExtension;
$dateFormatter = new \IntlDateFormatter(
locale: 'fr_FR',
dateType: \IntlDateFormatter::LONG,
timeType: \IntlDateFormatter::SHORT,
calendar: \IntlDateFormatter::GREGORIAN,
);
$twig->addExtension(new IntlExtension(
dateFormatterPrototype: $dateFormatter,
));
Arguments passed to a filter override these defaults. You can also configure a
pattern with the pattern argument.
When using a dependency injection container, pass the formatter as the
$dateFormatterPrototype argument of the IntlExtension service.