Як відобразити об’єкт 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;

І ось я отримую повідомлення про помилку:

Під час візуалізації шаблону було викинуто виняток ("Фатальна помилка, що піддається запису: Об'єкт класу DateTime не вдалося перетворити на рядок у ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php рядок 33" ) у "BeerBundle: Ігри: gameTable.html.twig" у рядку 10.

Відповіді:


305

Хоча ви можете використовувати

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

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

Редагувати :

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


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

6
Функція дати Twig використовує той же формат, що і функція php (від документів Twig). Для всіх, хто шукає інші формати, php.net/manual/en/function.date.php .
JonnyS

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

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: 41З

Рядки формату, прийняті dateфільтром, такі ж, як і для функції PHPdate() . (Єдина відмінність полягає в тому, що, наскільки я знаю, ви не можете використовувати заздалегідь визначені константи, які можна використовувати у функції PHP date())

Місцеві дати (та часи)

Однак, оскільки ви хочете відобразити його у веб-переглядачі, ви, ймовірно, захочете показати його у читаному для людини форматі, локалізованому для мови та місцезнаходження користувача. Замість того, щоб робити локалізацію самостійно, ви можете використовувати для цього розширення Intl (яке використовує IntlDateFormatter PHP ). Він забезпечує фільтр, 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місцевості;
  • 6 février 2014 10:52для frмісцевості;
  • 6. Februar 2014 10:52для deмісцевості; тощо.

Як бачите, localizeddateвін не лише перекладає назви місяців, але й використовує місцеві позначення. Англійська нотація ставить дату після місяця, де нідерландські, французькі та німецькі позначення ставлять її перед місяцем. Англійська та німецька назви місяця починаються з великої літери, тоді як імена голландських та французьких місяців - малі. А на німецьких фініках додається крапка.

Встановлення / налаштування місцевості

Інструкції з установки розширення Intl можна знайти в цій окремій відповіді .


1
Локалізовані дати (та часи) - дуже дякую за це @Nic - приголомшливо!
webDEVILopers

Привіт, використовуючи localizeddate, чи знаєте ви, як вивести тільки M і Y (не день)? thks
mario

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.