Одно из моих полей в одном из моих объектов - это переменная "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.
Хотя вы можете использовать
{{ game.gameDate|date('Y-m-d') }}
имейте в виду, что эта версия не соблюдает локаль пользователя, что не должно быть проблемой с сайтом, используемым только пользователями одной национальности. Международные пользователи должны отображать дату игры совершенно иначе, например, расширение класса \DateTime
и добавление к ней метода __toString()
, который проверяет локаль и действует соответственно.
Edit
Как указано @Nic в комментарии, если вы используете Intl extension of Twig, у вас будет доступный фильтр localizeddate
, который показывает дату в локали пользователей. Таким образом, вы можете отказаться от моей предыдущей идеи расширения \DateTime
.
{{ game.gameDate|date('Ymd H:i:s') }}
для даты и времени. У меня были проблемы с поиском персонажа за минуты.
Вы можете использовать date
:
{{ game.gameDate|date("m/d/Y") }}
Это зависит от формата, в котором вы хотите указать дату.
Если вы хотите отобразить статический формат, который будет одинаковым для всех локалей (например, 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 можно найти в этом отдельном ответе.
Не забывайте
@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
вы можете сделать следующим образом
{{post.published_at | date ( "m/d/Y" )}}
Подробнее см. http://twig.sensiolabs.org/doc/filters/date.html
{{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00
Для строки времени полной даты, включая смещение часового пояса.
Существует инструмент 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
Я знаю, что это довольно старый вопрос, но сегодня я нашел этот вопрос, но ответы были не тем, что мне нужно.
Итак, вот что мне нужно.
Если вы, как и я, хотите отобразить дату current в ветке, вы можете использовать следующее:
{{ "now"|date("m/d/Y") }}
Смотрите документацию об этом: