Как визуализировать объект DateTime в шаблоне Twig

Одним из моих полей в одном из моих объектов является переменная «datetime».

Как преобразовать это поле в строку для визуализации в браузере?

Вот фрагмент кода:

{% for game in games %} ... <td> {{game.gameTeamIdOne.teamName}} </td> <td> {{game.gameTeamIdTwo.teamName}} </td> <td> {{game.gameDate}}</td> </tr> {% endfor %} 

Вот переменная в моем классе сущностей:

 /** * @var date $gameDate * * @ORM\Column(name="GAME_DATE", type="datetime", nullable=true) */ private $gameDate; 

И вот сообщение об ошибке, которое я получаю:

Во время рендеринга шаблона было исключено исключение («Catchable Fatal Error: Object класса DateTime не удалось преобразовать в строку в … \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php строка 33" ) в «BeerBundle: Games: gameTable.html.twig» в строке 10.

Related of "Как визуализировать объект DateTime в шаблоне Twig"

Хотя вы можете использовать

 {{ game.gameDate|date('Ym-d') }} 

помните, что эта версия не соответствует локали пользователя, что не должно быть проблемой с сайтом, используемым только пользователями одной национальности. Международные пользователи должны отображать дату игры совершенно иначе, например, расширение класса \DateTime и добавление к ней метода __toString() который проверяет локаль и действует соответствующим образом.

Изменить :

Как указано @Nic в комментарии, если вы используете расширение Intl от Twig , у вас будет доступный localizeddate фильтр, который показывает дату в локали пользователя. Таким образом, вы можете отказаться от моей предыдущей идеи продления \DateTime .

Вы можете использовать фильтр date :

 {{ game.gameDate|date("m/d/Y") }} 

Это зависит от формата, в котором вы хотите указать дату.

Формат статической даты

Если вы хотите отобразить статический формат, который будет одинаковым для всех локалей (например, ISO 8601 для фида Atom), вы должны использовать фильтр date Twig:

 {{ game.gameDate|date('Ymd\\TH:i:sP') }} 

Который будет возвращать дату и время в следующем формате:

2014-05-02T08: 55: 41Z

Строки формата, принятые фильтром date такие же, как и для функции date() PHP . (единственная разница в том, что, насколько я знаю, вы не можете использовать предопределенные константы, которые могут использоваться в функции PHP date() )

Локализованные даты (и время)

Однако, поскольку вы хотите отобразить его в браузере, вам, скорее всего, захочется показать его в удобном для восприятия формате, локализованном для языка и местоположения пользователя. Вместо того, чтобы делать локализацию самостоятельно, вы можете использовать Intl Extension для этого (что использует PHP IntlDateFormatter ). Он предоставляет фильтр localizeddate который будет выводить дату и время с использованием локализованного формата.

 localizeddate( date_format, time_format [, locale ] ) 

Аргументы для localizeddate :

  • date_format : одна из строк формата (см. ниже)
  • time_format : одна из строк формата (см. ниже)
  • locale : (необязательно) Используйте это, чтобы переопределить настроенную локаль. Оставьте этот аргумент, чтобы использовать локаль по умолчанию, которую можно настроить в конфигурации Symfony.

(есть больше, см. документы для полного списка возможных аргументов)

Для date_format и time_format вы можете использовать одну из следующих строк:

  • 'none' если вы не хотите включать этот элемент
  • 'short' для самого сокращенного стиля (12/13/52 или 15:30 в английском языке)
  • 'medium' для среднего стиля (12 января 1952 года в английском языке)
  • 'long' для длинного стиля (12 января 1952 года или 15:30:32 в английском языке)
  • 'full' для полностью определенного стиля (вторник, 12 апреля 1952 года или 15:30:42 вечера PST в английском языке)

пример

Например, если вы хотите отобразить дату в формате, эквивалентном February 6, 2014 at 10:52 AM , используйте следующую строку в шаблоне Twig:

 {{ game.gameDate|localizeddate('long', 'short') }} 

Однако, если вы используете другой язык, результат будет локализован для этой локали:

  • 6 februari 2014 10:52 для nl locale;
  • 6 février 2014 10:52 для fr языка;
  • 6. Februar 2014 10:52 для локали; и т.п.

Как вы можете видеть, localizeddate не только переводит имена месяцев, но также использует локальные обозначения. Английская нотация помещает дату после месяца, где голландские, французские и немецкие обозначения помещают ее до месяца. Английские и немецкие месячные имена начинаются с прописной буквы, тогда как имена голландского и французского месяцев имеют строчные буквы. И немецкие даты имеют добавленную точку.

Установка / настройка языка

Инструкции по установке для расширения Intl можно найти в этом отдельном ответе .

Не забывайте

@ORM \ HasLifecycleCallbacks ()

Сущность :

 /** * Set gameDate * * @ORM\PrePersist */ public function setGameDate() { $this->dateCreated = new \DateTime(); return $this; } 

Посмотреть:

 {{ item.gameDate|date('Ymd H:i:s') }} 

>> Выпуск 2013-09-18 16:14:20

Существует инструмент symfony2 для отображения даты в текущей локали:

 {{ user.createdAt|localeDate }} to have a medium date and no time, in the current locale {{ user.createdAt|localeDate('long','medium') }} to have a long date and medium time, in the current locale 

https://github.com/michelsalib/BCCExtraToolsBundle

 {{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00 

Для строки времени полной даты, включая смещение часового пояса.

вы можете сделать следующим образом

{{post.published_at | date ("m / d / Y")}}

Подробнее см. http://twig.sensiolabs.org/doc/filters/date.html.

Я знаю, что это довольно старый вопрос, но сегодня я нашел этот вопрос, но ответы были не тем, что мне было нужно.

Итак, вот что мне нужно.

Если вы, как и я , хотите отобразить текущую дату в ветке, вы можете использовать следующее:

{{ "now"|date("m/d/Y") }}

См. Документацию об этом:

дата в ветке