wake-up-neo.com

Rendern eines DateTime-Objekts in einer Twig Vorlage

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 Codeausschnitt:

{% 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 ("Abfangbarer schwerwiegender Fehler: Objekt der Klasse DateTime konnte in ...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php Zeile 33 nicht in eine Zeichenfolge konvertiert werden." ) in "BeerBundle: Games: gameTable.html.twig" in Zeile 10.

205
Chris Ridmann

Obwohl Sie das verwenden können

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

beachten Sie, dass diese Version das Gebietsschema des Benutzers nicht berücksichtigt. Dies sollte kein Problem mit einer Site sein, die nur von Benutzern einer Nationalität verwendet wird. Internationale Benutzer sollten das Spieldatum völlig anders anzeigen, z. B. die Klasse \DateTime Erweitern und eine __toString() -Methode hinzufügen, die das Gebietsschema überprüft und entsprechend vorgeht.

Bearbeiten :

Wie von @Nic in einem Kommentar hervorgehoben, steht Ihnen bei Verwendung der Intl-Erweiterung von Twig ein localizeddate -Filter zur Verfügung, der das Datum in der Ländereinstellung des Benutzers anzeigt. Auf diese Weise können Sie meine vorherige Idee der Erweiterung von \DateTime Verwerfen.

288
GergelyPolonkai

Sie können date Filter verwenden:

{{ game.gameDate|date("m/d/Y") }}
88
Ondrej Slinták

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 ein Atom = feed), sollten Sie Twigs date Filter 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 Filter date akzeptierten Formatzeichenfolgen sind die gleichen, die Sie für die Funktion date() von PHP verwenden würden . (Der einzige Unterschied besteht meines Wissens darin, dass Sie die vordefinierten Konstanten, die in der Funktion PHP date() 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 den Benutzer lesbaren Format anzeigen, das für die Sprache und den Standort des Benutzers lokalisiert ist. Anstatt die Lokalisierung selbst vorzunehmen, können Sie dafür die Intl-Erweiterung verwenden (wobei PHPs IntlDateFormatter ). 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: Einer der Formatstrings (siehe unten)
  • time_format: Einer der Formatstrings (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.

(Es gibt noch mehr, siehe in den Dokumenten für die vollständige Liste der möglichen Argumente)

Für date_format Und time_format Können Sie eine der folgenden Zeichenfolgen verwenden:

  • 'none', Wenn Sie dieses Element nicht einschließen möchten
  • 'short' Für den abgekürztesten Stil (13.12.52 oder 15.30 Uhr in einem englischen Gebietsschema)
  • 'medium' Für den mittleren Stil (12. Januar 1952 in einem englischen Gebietsschema)
  • 'long' Für den langen Stil (12. Januar 1952 oder 15.30.32 Uhr in einem englischen Gebietsschema)
  • 'full' Für den vollständig festgelegten 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 February 6, 2014 at 10:52 AM Entspricht, verwenden Sie die folgende Zeile in Ihrer Vorlage Twig):

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

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

  • 6 februari 2014 10:52 Für das Gebietsschema nl;
  • 6 février 2014 10:52 Für das Gebietsschema fr;
  • 6. Februar 2014 10:52 Für das Gebietsschema de; usw.

Wie Sie sehen, übersetzt localizeddate nicht nur die Monatsnamen, sondern verwendet auch die lokalen Notationen. In der englischen Notation steht das Datum nach dem Monat, in der niederländischen, französischen und deutschen Notation vor dem Monat. Englische und deutsche Monatsnamen beginnen mit einem Großbuchstaben, niederländische und französische Monatsnamen mit einem Kleinbuchstaben. Und deutschen Daten ist ein Punkt angehängt.

Installation/Einstellen des Gebietsschemas

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

66
Nic Wortel

nicht vergessen

@ORM\HasLifecycleCallbacks ()

Entität:

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

        return $this;
    }

Ansicht:

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

>> Ausgabe 18.09.2013 16:14:20

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

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

2
Venkat Kotra

sie können auf folgende Weise rendern

{{post.published_at | date ("m/d/y")}}

Weitere Informationen finden Sie unter http://twig.sensiolabs.org/doc/filters/date.html

2
Zaheer Babar

Es gibt ein symfony2-Tool, mit dem das Datum im aktuellen Gebietsschema angezeigt werden kann:

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

Ich weiß, das ist eine ziemlich alte Frage, 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 Dokumentation dazu:

Datum im Zweig

1
Refilon