Как отобразить объект 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;

И вот сообщение об ошибке, которое я получаю:

Во время визуализации шаблона возникло исключение ("Обнаруживаемая фатальная ошибка: объект класса DateTime не удалось преобразовать в строку в ...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php строка 33") в "Beerbundle:Игры:GameTable.html.twig" в строке 10.

Author: gvlasov, 2011-11-30

8 answers

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

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

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

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

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

 268
Author: GergelyPolonkai, 2017-06-16 15:37:15

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

{{ game.gameDate|date("m/d/Y") }}
 84
Author: Ondrej Slinták, 2011-11-29 22:56:17

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

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

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

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

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

2014-05-02T08:55:41Z

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

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

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

Пример

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

{{ 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 можно найти в этом отдельном ответе.

 65
Author: Nic Wortel, 2017-08-11 16:01:58

Не забывай

@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

 3
Author: Ivan, 2013-09-18 14:30:23

Существует инструмент 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
Author: ihsan, 2013-09-07 10:14:57
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

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

 2
Author: Venkat Kotra, 2014-02-06 16:48:29

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

{{ сообщение.опубликовано_ат|дата ("м/д/Г") }}

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

 2
Author: Zaheer Babar, 2014-12-10 12:28:15

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

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

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

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

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

Дата в веточке

 0
Author: Refilon, 2017-06-24 22:47:33