Come eseguire il rendering di un oggetto DateTime in un modello Twig


215

Uno dei miei campi in una delle mie entità è una variabile "datetime".

Come posso convertire questo campo in una stringa per renderizzarlo in un browser?

Ecco uno snippet di codice:

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

Ecco la variabile nella mia classe di entità:

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

Ed ecco il messaggio di errore che sto ricevendo:

È stata generata un'eccezione durante il rendering di un modello ("Errore irreversibile irreversibile: l'oggetto della classe DateTime non può essere convertito in stringa in ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php linea 33" ) in "BeerBundle: Giochi: gameTable.html.twig" alla riga 10.

Risposte:


305

Sebbene sia possibile utilizzare il

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

approccio, tenere presente che questa versione non rispetta le impostazioni locali dell'utente, che non dovrebbe costituire un problema con un sito utilizzato solo da utenti di una nazionalità. Gli utenti internazionali dovrebbero visualizzare la data del gioco in modo totalmente diverso, come estendere la \DateTimeclasse e aggiungere un __toString()metodo che controlli la locale e agisca di conseguenza.

Modifica :

Come sottolineato da @Nic in un commento, se si utilizza l' estensione Intl di Twig , sarà localizeddatedisponibile un filtro che mostra la data nella lingua dell'utente. In questo modo puoi abbandonare la mia precedente idea di estensione \DateTime.


45
{{ game.gameDate|date('Y-m-d H:i:s') }}per data e ora. Ho avuto problemi a trovare il personaggio per minuti.
Murko,

6
La funzione di data di Twig utilizza lo stesso formato della funzione php (dai documenti di Twig). Per chiunque cerchi altri formati, php.net/manual/en/function.date.php .
JonnyS

9
Fai attenzione ai valori null; in un caso d'uso simile, vedo la data odierna quando si invia un valore null alla datefunzione di Twig . Sulla base del tuo esempio, dovrai racchiuderlo{% if game.gameDate is not empty %} ... {%endif}
fazy

4
Per quanto riguarda la localizzazione, non dovresti estendere la DateTimelezione! Invece, usa semplicemente il localizeddatefiltro per Twig .
Nic Wortel,

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}sarebbe suggerito
Dheeraj il

90

Puoi usare il datefiltro:

{{ game.gameDate|date("m/d/Y") }}

3
Totalmente d'accordo con te. È qualcosa che dovrebbe essere lì per impostazione predefinita.
tftd

2
@ThomasDecaux che in realtà non è affatto strano, perché un __toString()metodo avrebbe bisogno di sapere in quale formato convertire l' DateTimeoggetto, e probabilmente ci sono centinaia di possibili formati là fuori. Ovviamente, in PHP puoi usare il format()metodo su un DateTimeoggetto, che accetta un argomento di formato, e il datefiltro è semplicemente l'equivalente di Twig di quel metodo.
Nic Wortel,

68

Dipende dal formato in cui si desidera visualizzare la data.

Formato data statico

Se si desidera visualizzare un formato statico, che è lo stesso per tutte le versioni locali (ad esempio ISO 8601 per un feed Atom), è necessario utilizzare il datefiltro Twig :

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

Che restituirà sempre un datetime nel seguente formato:

2014-05-02T08: 55: 41Z

Le stringhe di formato accettate dal datefiltro sono le stesse utilizzate per la date()funzione di PHP . (l'unica differenza è che, per quanto ne so, non è possibile utilizzare le costanti predefinite che possono essere utilizzate nella date()funzione PHP )

Date (e orari) localizzati

Tuttavia, poiché vuoi renderlo nel browser, probabilmente vorrai mostrarlo in un formato leggibile dall'uomo, localizzato per la lingua e la posizione dell'utente. Invece di fare tu stesso la localizzazione, puoi usare l' estensione Intl per questo (che utilizza IntlDateFormatter di PHP ). Fornisce un filtro localizeddateche genererà la data e l'ora utilizzando un formato localizzato.

localizeddate( date_format, time_format [, locale ] )

Argomenti per localizeddate:

  • date_format: Una delle stringhe di formato (vedi sotto)
  • time_format: Una delle stringhe di formato (vedi sotto)
  • locale: (opzionale) Usalo per sovrascrivere le impostazioni locali configurate. Lascia questo argomento fuori per usare la locale predefinita, che può essere configurata nella configurazione di Symfony.

(ce ne sono altri, vedere i documenti per l'elenco completo dei possibili argomenti)

Per date_formate time_formatpuoi usare una delle seguenti stringhe:

  • 'none' se non vuoi includere questo elemento
  • 'short' per lo stile più abbreviato (13/12/52 o 15:30 in un locale inglese)
  • 'medium' per lo stile medio (12 gennaio 1952 in un locale inglese)
  • 'long' per il lungo stile (12 gennaio 1952 o 15:30:32 in un locale inglese)
  • 'full' per lo stile completamente specificato (martedì 12 aprile 1952 d.C. o 15:30:42 PST in un locale inglese)

Esempio

Quindi, ad esempio, se vuoi visualizzare la data in un formato equivalente a February 6, 2014 at 10:52 AM, usa la seguente riga nel tuo modello Twig:

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

Tuttavia, se si utilizza una locale diversa, il risultato verrà localizzato per quella locale:

  • 6 februari 2014 10:52per il nllocale;
  • 6 février 2014 10:52per il frlocale;
  • 6. Februar 2014 10:52per il delocale; eccetera.

Come puoi vedere, localizeddatenon solo traduce i nomi dei mesi ma utilizza anche le notazioni locali. La notazione inglese indica la data successiva al mese, dove le notazioni olandesi, francesi e tedesche la inseriscono prima del mese. I nomi dei mesi in inglese e tedesco iniziano con una lettera maiuscola, mentre i nomi dei mesi in olandese e francese sono in minuscolo. E le date tedesche hanno un punto aggiunto.

Installazione / impostazione della locale

Le istruzioni di installazione per l'estensione Intl sono disponibili in questa risposta separata .


1
Date (e orari) localizzati - grazie mille per questo @Nic - fantastico!
webDEVILopers

Ciao, usando localizeddate, sai come produrre solo M e Y (non giorno)? thks
mario,

3

Non dimenticare

@ORM \ HasLifecycleCallbacks ()

Entità:

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

        return $this;
    }

Visualizza:

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

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


2

Esiste uno strumento symfony2 per visualizzare la data nella locale corrente:

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

Per la stringa di data e ora compresa la differenza di fuso orario.



1

So che questa è una domanda piuttosto vecchia, ma ho trovato questa domanda oggi, ma le risposte non erano ciò di cui avevo bisogno.

Quindi ecco quello di cui avevo bisogno.

Se, come me , stai cercando di visualizzare la data corrente in un ramoscello, puoi utilizzare quanto segue:

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

Vedi la documentazione al riguardo:

data in un ramoscello


0

Per evitare errori sul valore null è possibile utilizzare questo codice:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.