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


215

Одно из моих полей в одной из моих сущностей - это переменная 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.

Ответы:


305

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

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

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

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

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


45
{{ game.gameDate|date('Y-m-d H:i:s') }}для даты и времени. У меня были проблемы с поиском персонажа за минуты.
Murko

6
Функция даты Twig использует тот же формат, что и функция php (из документации Twig). Для тех, кто ищет другие форматы, php.net/manual/en/function.date.php .
JonnyS

9
Остерегайтесь нулевых значений; в аналогичном случае использования я вижу сегодняшнюю дату, когда передаю нулевое значение в dateфункцию Twig . Исходя из вашего примера, вам нужно обернуть его{% if game.gameDate is not empty %} ... {%endif}
fazy

4
Что касается локализации, вы не должны расширять DateTimeкласс! Вместо этого просто используйте localizeddateфильтр для Twig .
Ник Уортел

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}будет предложено
Dheeraj

90

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

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

3
Полностью с вами согласен. Это то, что должно быть там по умолчанию.
TFTD

2
@ThomasDecaux это на самом деле не так уж и странно, потому что __toString()метод должен знать, в какой формат преобразовывать DateTimeобъект, и, возможно, существуют сотни возможных форматов. Конечно, в PHP вы можете использовать format()метод для DateTimeобъекта, который принимает аргумент формата, и dateфильтр является просто эквивалентом Twig этого метода.
Ник Уортел

68

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

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

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

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

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

2014-05-02T08: 55: 41Z

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

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

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

localizeddate( date_format, time_format [, locale ] )

Аргументы за localizeddate:

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

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

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

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

пример

Так, например, если вы хотите отобразить дату в формате, эквивалентном 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 можно найти в этом отдельном ответе .


1
Локализованные даты (и время) - большое спасибо за это @Nic - потрясающе!
webDEVILopers

Привет, используя localizeddate, вы знаете, как вывести только M и Y (не день)? спасибо
Марио

3

Не забывайте

@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

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


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

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



1

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

Так вот что мне было нужно.

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

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

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

дата в ветке


0

Чтобы избежать ошибки при нулевом значении, вы можете использовать этот код:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.