Одним из моих полей в одном из моих объектов является переменная «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.
Хотя вы можете использовать
{{ 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
{{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") }}
См. Документацию об этом:
дата в ветке