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

Ответ 1

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

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

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

Edit

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

2014-05-02T08: 55: 41Z

Строки формата, принятые фильтром date, те же, что и для PHP date() function. (единственное отличие состоит в том, что, насколько я знаю, вы не можете использовать предопределенные константы, которые могут использоваться в функции 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 или 3: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;
  • 6 février 2014 10:52 для локали fr;
  • 6. Februar 2014 10:52 для локали de; и др.

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

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

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

Ответ 4

Не забывайте

@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

Ответ 5

Существует инструмент 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

Ответ 6

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

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

Ответ 8

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

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

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

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

Смотрите документацию об этом:

дата в ветке