Twig

The flexible, fast, and secure
template engine for PHP

a Symfony Product
Docs Filters format_datetime
Docs for Twig version 3.x
Switch to another version: 1.x, 2.x

Questions & Feedback

License

Twig documentation is licensed under the new BSD license.

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.

Arguments

  • locale: The locale code as defined in RFC 5646
  • dateFormat: The date format
  • timeFormat: The time format
  • pattern: A date time pattern
  • timezone: The date timezone name
  • calendar: The calendar