So rendern Sie ein DateTime-Objekt in einer Twig-Vorlage

215

Eines meiner Felder in einer meiner Entitäten ist eine "datetime" -Variable.

Wie kann ich dieses Feld in eine Zeichenfolge konvertieren, um es in einem Browser zu rendern?

Hier ist ein Code-Snippet:

{% for game in games %}
    ...
        <td> {{game.gameTeamIdOne.teamName}} </td>
        <td> {{game.gameTeamIdTwo.teamName}} </td>
        <td> {{game.gameDate}}</td>
    </tr>
{% endfor %}

Hier ist die Variable in meiner Entitätsklasse:

/**
 * @var date $gameDate
 *
 * @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
 */
private $gameDate;

Und hier ist die Fehlermeldung, die ich bekomme:

Beim Rendern einer Vorlage wurde eine Ausnahme ausgelöst ("Catchable Fatal Error: Objekt der Klasse DateTime konnte nicht in Zeichenfolge in ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php Zeile 33 konvertiert werden." ) in "BeerBundle: Games: gameTable.html.twig" in Zeile 10.

Chris Ridmann
quelle

Antworten:

305

Obwohl Sie die verwenden können

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

Beachten Sie, dass diese Version das Gebietsschema des Benutzers nicht berücksichtigt, was bei einer Website, die nur von Benutzern einer Nationalität verwendet wird, kein Problem darstellen sollte. Internationale Benutzer sollten das Spieldatum völlig anders anzeigen, z. B. die \DateTimeKlasse erweitern und eine __toString()Methode hinzufügen , die das Gebietsschema überprüft und entsprechend handelt.

Bearbeiten :

Wie von @Nic in einem Kommentar hervorgehoben, steht Ihnen bei Verwendung der Intl-Erweiterung von Twig ein localizeddateFilter zur Verfügung, der das Datum im Gebietsschema des Benutzers anzeigt. Auf diese Weise können Sie meine vorherige Idee der Erweiterung fallen lassen \DateTime.

GergelyPolonkai
quelle
45
{{ game.gameDate|date('Y-m-d H:i:s') }}für Datum und Uhrzeit. Ich hatte minutenlang Probleme, Charakter zu finden.
Murko
6
Die Datumsfunktion von Twig verwendet dasselbe Format wie die PHP-Funktion (aus den Twig-Dokumenten). Für alle, die nach anderen Formaten suchen, php.net/manual/en/function.date.php .
JonnyS
9
Achten Sie auf Nullwerte. In einem ähnlichen Anwendungsfall sehe ich das heutige Datum, wenn ein Nullwert an Twigs dateFunktion weitergeleitet wird. Basierend auf Ihrem Beispiel müssen Sie es {% if game.gameDate is not empty %} ... {%endif}
einpacken
4
Was die Lokalisierung betrifft, sollten Sie die DateTimeKlasse nicht erweitern ! Verwenden Sielocalizeddate stattdessen einfach den Filter für Twig .
Nic Wortel
1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}würde vorgeschlagen werden
Dheeraj
90

Sie können dateFilter verwenden:

{{ game.gameDate|date("m/d/Y") }}
Ondrej Slinták
quelle
3
Ich stimme dir vollkommen zu. Es ist etwas, das standardmäßig vorhanden sein sollte.
Tftd
2
@ThomasDecaux, das ist eigentlich gar nicht so seltsam, weil eine __toString()Methode wissen müsste, in welches Format das DateTimeObjekt konvertiert werden soll, und es gibt wahrscheinlich Hunderte von möglichen Formaten. Natürlich können Sie in PHP die format()Methode für ein DateTimeObjekt verwenden, das ein Formatargument verwendet, und der dateFilter ist einfach das Twig-Äquivalent dieser Methode.
Nic Wortel
68

Dies hängt vom Format ab, in dem das Datum angezeigt werden soll.

Statisches Datumsformat

Wenn Sie ein statisches Format anzeigen möchten, das für alle Ländereinstellungen gleich ist (z. B. ISO 8601 für einen Atom-Feed), sollten Sie den Twig- dateFilter verwenden :

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

Was immer eine Datums- / Uhrzeitangabe im folgenden Format zurückgibt:

2014-05-02T08: 55: 41Z

Die vom dateFilter akzeptierten Formatzeichenfolgen sind die gleichen, die Sie für die PHP- date()Funktion verwenden würden . (Der einzige Unterschied besteht darin, dass Sie meines Wissens die vordefinierten Konstanten, die in der PHP- date()Funktion verwendet werden können, nicht verwenden können. )

Lokalisierte Daten (und Zeiten)

Da Sie es jedoch im Browser rendern möchten, möchten Sie es wahrscheinlich in einem für Menschen lesbaren Format anzeigen, das für die Sprache und den Standort des Benutzers lokalisiert ist. Anstatt die Lokalisierung selbst durchzuführen , können Sie hierfür die Intl-Erweiterung verwenden (die den IntlDateFormatter von PHP verwendet ). Es bietet einen Filter localizeddate, der Datum und Uhrzeit in einem lokalisierten Format ausgibt.

localizeddate( date_format, time_format [, locale ] )

Argumente für localizeddate:

  • date_format: Eine der Formatzeichenfolgen (siehe unten)
  • time_format: Eine der Formatzeichenfolgen (siehe unten)
  • locale: (optional) Verwenden Sie diese Option, um das konfigurierte Gebietsschema zu überschreiben. Lassen Sie dieses Argument weg, um das Standardgebietsschema zu verwenden, das in der Symfony-Konfiguration konfiguriert werden kann.

(Weitere Informationen finden Sie in den Dokumenten. Die vollständige Liste der möglichen Argumente finden Sie hier.)

Für date_formatund können time_formatSie eine der folgenden Zeichenfolgen verwenden:

  • 'none' Wenn Sie dieses Element nicht einschließen möchten
  • 'short' für den am meisten abgekürzten Stil (13.12.52 oder 15.30 Uhr in einem englischen Gebietsschema)
  • 'medium' für den mittleren Stil (12. Januar 1952 in englischer Sprache)
  • 'long' für den langen Stil (12. Januar 1952 oder 15.30:32 Uhr in einem englischen Gebietsschema)
  • 'full' für den vollständig spezifizierten Stil (Dienstag, 12. April 1952 n. Chr. oder 15.30:42 Uhr PST in einem englischen Gebietsschema)

Beispiel

Wenn Sie beispielsweise das Datum in einem Format anzeigen möchten, das dem entspricht February 6, 2014 at 10:52 AM, verwenden Sie die folgende Zeile in Ihrer Twig-Vorlage:

{{ game.gameDate|localizeddate('long', 'short') }}

Wenn Sie jedoch ein anderes Gebietsschema verwenden, wird das Ergebnis für dieses Gebietsschema lokalisiert:

  • 6 februari 2014 10:52für das nlGebietsschema;
  • 6 février 2014 10:52für das frGebietsschema;
  • 6. Februar 2014 10:52für das deGebietsschema; etc.

Wie Sie sehen können, werden localizeddatenicht nur die Monatsnamen übersetzt, sondern auch die lokalen Notationen verwendet. In der englischen Notation wird das Datum nach dem Monat angegeben, in den niederländischen, französischen und deutschen Notationen vor dem Monat. Englische und deutsche Monatsnamen beginnen mit einem Großbuchstaben, während niederländische und französische Monatsnamen in Kleinbuchstaben geschrieben sind. Und an deutsche Daten ist ein Punkt angehängt.

Installieren / Einstellen des Gebietsschemas

Installationsanweisungen für die Intl-Erweiterung finden Sie in dieser separaten Antwort .

Nic Wortel
quelle
1
Lokalisierte Daten (und Zeiten) - vielen Dank für dieses @Nic - großartig!
WebDEVILopers
Hallo, wissen Sie mit localizeddate, wie Sie nur M und Y (nicht Tag) ausgeben können? thks
mario
3

Vergiss nicht

@ORM \ HasLifecycleCallbacks ()

Entität :

/**
     * Set gameDate
     *
     * @ORM\PrePersist
     */
    public function setGameDate()
    {
        $this->dateCreated = new \DateTime();

        return $this;
    }

Aussicht:

{{ item.gameDate|date('Y-m-d H:i:s') }}

>> Ausgabe 2013-09-18 16:14:20

Ivan
quelle
2

Es gibt ein symfony2-Tool zum Anzeigen des Datums im aktuellen Gebietsschema:

{{ 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

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

Für die vollständige Datums- und Uhrzeitzeichenfolge einschließlich Zeitzonenversatz.

Venkat Kotra
quelle
1

Ich weiß, dass dies eine ziemlich alte Frage ist, aber ich habe diese Frage heute gefunden, aber die Antworten waren nicht das, was ich brauchte.

Also hier ist was ich brauchte.

Wenn Sie wie ich das aktuelle Datum im Zweig anzeigen möchten, können Sie Folgendes verwenden:

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

Siehe dazu die Dokumentation:

Datum im Zweig

Refilon
quelle
0

Um Fehler beim Nullwert zu vermeiden, können Sie diesen Code verwenden:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Arnold Richmon
quelle