236 votes

Comment rendre un objet DateTime dans un template Twig

Un des champs de l'une de mes entités est une variable "datetime".

Comment puis-je convertir ce champ en une chaîne de caractères à afficher dans un navigateur?

Voici un extrait de code :

{% for game in games %}
    ...
         {{game.gameTeamIdOne.teamName}} 
         {{game.gameTeamIdTwo.teamName}} 
         {{game.gameDate|date('Y-m-d H:i:s')}}

{% endfor %}

Voici la variable dans la classe de mon entité :

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

Et voici le message d'erreur que je reçois :

Une exception a été levée lors du rendu d'un modèle ("Catchable Fatal Error: Objet de la classe DateTime ne peut pas être converti en chaîne dans ...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php ligne 33") dans "BeerBundle:Games:gameTable.html.twig" à la ligne 10.

327voto

GergelyPolonkai Points 1586

Bien que vous puissiez utiliser l'

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

approche, gardez à l'esprit que cette version ne respecte pas le paramètre local de l'utilisateur, ce qui ne devrait pas poser de problème pour un site utilisé uniquement par des utilisateurs d'une seule nationalité. Les utilisateurs internationaux devraient afficher la date du jeu de manière totalement différente, comme en étendant la classe \DateTime et en ajoutant une méthode __toString() qui vérifie le paramètre local et agit en conséquence.

Éditer:

Comme l'a souligné @Nic dans un commentaire, si vous utilisez l'extension Intl de Twig, vous disposerez d'un filtre localizeddate qui affiche la date dans le paramètre local de l'utilisateur. De cette façon, vous pouvez abandonner mon idée précédente d'étendre \DateTime.

54 votes

{{ game.gameDate|date('Y-m-d H:i:s') }} pour la date et l'heure. J'ai eu des problèmes à trouver le caractère pour les minutes.

6 votes

La fonction de date de Twig utilise le même format que la fonction php (selon les docs Twig). Pour ceux qui recherchent d'autres formats, php.net/manual/fr/function.date.php.

9 votes

Faites attention aux valeurs nulles; dans un cas d'utilisation similaire, je vois la date d'aujourd'hui lorsque je transmets une valeur nulle à la fonction date de Twig. Selon votre exemple, vous devrez l'encadrer dans {% if game.gameDate is not empty %}...{% endif}

91voto

Ondrej Slinták Points 9922

Vous pouvez utiliser le filtre date :

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

3 votes

Totalement d'accord avec vous. C'est quelque chose qui devrait être là par défaut.

2 votes

@ThomasDecaux ce n'est en fait pas si étrange que ça, car une méthode __toString() aurait besoin de savoir dans quel format convertir l'objet DateTime, et il existe probablement des centaines de formats possibles. Bien sûr, en PHP vous pouvez utiliser la méthode format() sur un objet DateTime, qui prend un argument de format, et le filtre date est simplement l'équivalent Twig de cette méthode.

76voto

Nic Points 2166

Il dépend du format dans lequel vous souhaitez afficher la date.

Format de date statique

Si vous souhaitez afficher un format statique, identique pour toutes les langues (par exemple ISO 8601 pour un flux Atom), vous devriez utiliser le filtre date de Twig:

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

Cela retournera toujours une date et heure dans le format suivant :

2014-05-02T08:55:41Z

Les chaînes de format acceptées par le filtre date sont les mêmes que celles que vous utiliseriez pour la fonction date() de PHP. (la seule différence est que, autant que je sache, vous ne pouvez pas utiliser les constantes prédéfinies qui peuvent être utilisées dans la fonction date() de PHP)

Dates (et heures) localisées

Cependant, puisque vous voulez l'afficher dans le navigateur, vous voudrez probablement l'afficher dans un format lisible par les humains, localisé en fonction de la langue et de l'emplacement de l'utilisateur. Au lieu de gérer la localisation vous-même, vous pouvez utiliser l'extension Intl Extension pour cela (qui utilise le IntlDateFormatter de PHP). Elle fournit un filtre localizeddate qui affichera la date et l'heure dans un format localisé.

localizeddate(format_date, format_heure [, locale ] )

Arguments pour localizeddate :

  • format_date : Une des chaînes de format (voir ci-dessous)
  • format_heure : Une des chaînes de format (voir ci-dessous)
  • locale : (optionnel) Utilisez ceci pour remplacer la locale configurée. Laissez cet argument de côté pour utiliser la locale par défaut, qui peut être configurée dans la configuration de Symfony.

(il y en a plus, voir la documentation pour la liste complète des arguments possibles)

Pour format_date et format_heure, vous pouvez utiliser l'une des chaînes suivantes :

  • 'none' si vous ne voulez pas inclure cet élément
  • 'short' pour le style le plus abrégé (12/13/52 ou 15h30 dans une locale anglaise)
  • 'medium' pour le style moyen (12 janv. 1952 dans une locale anglaise)
  • 'long' pour le style long (12 janvier 1952 ou 15h30min32s dans une locale anglaise)
  • 'full' pour le style complètement spécifié (mardi 12 avril 1952 après JC ou 15h30min42s PST dans une locale anglaise)

Exemple

Ainsi, par exemple, si vous souhaitez afficher la date dans un format équivalent à 6 février 2014 à 10:52, utilisez la ligne suivante dans votre template Twig :

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

Cependant, si vous utilisez une locale différente, le résultat sera localisé pour cette locale :

  • 6 februari 2014 10:52 pour la locale nl ;
  • 6 février 2014 10:52 pour la locale fr ;
  • 6. Februar 2014 10:52 pour la locale de ; etc.

Comme vous pouvez le constater, localizeddate ne se contente pas de traduire les noms des mois mais utilise également les notations locales. La notation anglaise place la date après le mois, alors que les notations néerlandaise, française et allemande la placent avant le mois. Les noms des mois en anglais et en allemand commencent par une lettre majuscule, tandis que les noms des mois en néerlandais et en français sont en minuscules. Et les dates en allemand ont un point ajouté.

Installation / configuration de la locale

Les instructions d'installation pour l'extension Intl peuvent être trouvées dans cette réponse séparée.

1 votes

Dates localisées (et heures) - Merci beaucoup pour cela @Nic - génial!

0 votes

Salut, en utilisant localizeddate, savez-vous comment afficher seulement M et Y (pas de jour) ? merci

0 votes

Si vous remplissez le temps pour le type d'entrée "datetime-local" afin de l'afficher correctement dans TWIG, utilisez Y-m-d\TH:i

4voto

Ikac Points 310

N'oublie pas

@ORM\HasLifecycleCallbacks()

Entité :

/**
     * Définir la date du jeu
     *
     * @ORM\PrePersist
     */
    public function setGameDate()
    {
        $this->dateCreated = new \DateTime();

        return $this;
    }

Vue :

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

>> Résultat 2013-09-18 16:14:20

2voto

ihsan Points 783

Il existe un outil symfony2 pour afficher la date dans la langue actuelle:

{{ user.createdAt|localeDate }} pour avoir une date moyenne sans heure, dans la langue actuelle

{{ user.createdAt|localeDate('long','medium') }} pour avoir une date longue avec une heure moyenne, dans la langue actuelle

https://github.com/michelsalib/BCCExtraToolsBundle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X