Как отобразить объект DateTime в шаблоне Twig - PullRequest
202 голосов
/ 30 ноября 2011

Одним из моих полей в одной из моих сущностей является переменная "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: объект класса DateTime не может быть преобразован в строку в ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php строка 33 ") в" BeerBundle: Games: gameTable.html.twig "в строке 10.

Ответы [ 8 ]

285 голосов
/ 17 апреля 2012

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

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

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

Редактировать

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

87 голосов
/ 30 ноября 2011

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

{{ game.gameDate|date("m/d/Y") }}
66 голосов
/ 02 мая 2014

Это зависит от формата, в котором вы хотите, чтобы дата отображалась как.

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

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

{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}

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

2014-05-02T08: 55: 41Z

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

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

Однако, поскольку вы хотите отобразить его в браузере, вам, скорее всего, потребуется показать его в удобочитаемом формате, локализованном для языка и местоположения пользователя. Вместо того, чтобы выполнять локализацию самостоятельно, вы можете использовать для этого расширение Intl (которое использует 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 или 3:30:32 вечера в английском языке)
  • 'full' для полностью определенного стиля (вторник, 12 апреля 1952 года нашей эры или 15:30:42 PST в английском языке)
* +1078 * Пример

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

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

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

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

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

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

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

3 голосов
/ 18 сентября 2013

Не забудьте

@ ORM \ HasLifecycleCallbacks ()

Объект:

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

        return $this;
    }

Вид:

{{ item.gameDate|date('Y-m-d H:i:s') }}

>> Вывод 2013-09-18 16: 14: 20

2 голосов
/ 10 декабря 2014

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

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

Для получения более подробной информации посетитеhttp://twig.sensiolabs.org/doc/filters/date.html

2 голосов
/ 06 февраля 2014
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

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

2 голосов
/ 07 сентября 2013

Для отображения даты в текущей локали существует инструмент 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

1 голос
/ 25 июня 2017

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

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

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

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

См. Документацию по этому вопросу:

дата в веточке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...