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.
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.
Sie können date
Filter verwenden:
{{ game.gameDate|date("m/d/Y") }}
Dies hängt vom Format ab, in dem das Datum angezeigt werden soll.
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.)
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)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.
Installationsanweisungen für die Intl-Erweiterung finden Sie in dieser separaten Antwort .
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
{{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00
Für vollständige Datums- und Uhrzeitzeichenfolge einschließlich Zeitzonenversatz.
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
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
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: