web-dev-qa-db-fra.com

Comment rendre un objet DateTime dans un modèle Twig

L'un de mes champs dans l'une de mes entités est une variable "datetime".

Comment puis-je convertir ce champ en chaîne à afficher dans un navigateur?

Voici un extrait de code:

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

Voici la variable dans ma classe d'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 ("Erreur irrécupérable capturable: l'objet de la classe DateTime n'a pas pu être converti en chaîne dans ...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php line 33" ) dans "BeerBundle: Games: gameTable.html.twig" à la ligne 10.

205
Chris Ridmann

Bien que vous puissiez utiliser le

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

approche, gardez à l’esprit que cette version ne respecte pas les paramètres régionaux de l’utilisateur, ce qui ne devrait pas poser de problème si un site est utilisé uniquement par des utilisateurs d’une même nationalité. Les utilisateurs internationaux doivent afficher la date du jeu de manière totalement différente, par exemple en étendant la classe \DateTime et en y ajoutant une méthode __toString() qui vérifie les paramètres régionaux et agit en conséquence.

Éditer :

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

288
GergelyPolonkai

Vous pouvez utiliser le filtre date :

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

Cela dépend du format d'affichage de la date.

Format de date statique

Si vous souhaitez afficher un format statique identique pour tous les paramètres régionaux (par exemple, ISO 8601 pour un flux Atom,), vous devez utiliser le type date filter :

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

Ce qui retournera toujours une date/heure au 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 fonction date() de PHP . (la seule différence est que, pour autant que je sache, vous ne pouvez pas utiliser les constantes prédéfinies qui peuvent être utilisées dans la fonction PHP date())

Dates et heures localisées

Toutefois, puisque vous souhaitez l'afficher dans le navigateur, vous souhaiterez probablement l'afficher dans un format lisible par l'homme, localisé pour la langue et l'emplacement de l'utilisateur. Au lieu de faire la localisation vous-même, vous pouvez utiliser le Intl Extension pour cela (qui utilise PHP IntlDateFormatter ). Il fournit un filtre localizeddate qui générera la date et l'heure en utilisant un format localisé.

localizeddate( date_format, time_format [, locale ] )

Arguments pour localizeddate:

  • date_format: Un des chaînes de format (voir ci-dessous)
  • time_format: Un des chaînes de format (voir ci-dessous)
  • locale: (facultatif) Utilisez-le pour remplacer les paramètres régionaux configurés. Laissez cet argument pour utiliser les paramètres régionaux par défaut, qui peuvent être configurés dans la configuration de Symfony.

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

Pour date_format et time_format, 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 langue anglaise)
  • 'medium' pour le style moyen (12 janvier 1952 dans une langue anglaise)
  • 'long' pour le style long (12 janvier 1952 ou 15h30:32 dans une langue anglaise)
  • 'full' pour le style complètement spécifié (mardi 12 avril 1952 après JC ou 15h30:42 HNP dans une langue anglaise)

Exemple

Ainsi, par exemple, si vous souhaitez afficher la date dans un format équivalent à February 6, 2014 at 10:52 AM, utilisez la ligne suivante dans votre modèle Twig:

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

Toutefois, si vous utilisez des paramètres régionaux différents, le résultat sera localisé pour ces paramètres régionaux:

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

Comme vous pouvez le constater, localizeddate ne traduit pas seulement les noms de mois, mais utilise également les notations locales. La notation anglaise met la date après le mois, où les notations néerlandaise, française et allemande la mettent avant le mois. Les noms de mois en anglais et en allemand commencent par une lettre majuscule, tandis que les noms de mois en néerlandais et en français sont en minuscule. Et les dates allemandes ont un point ajouté.

Installation/définition des paramètres régionaux

Les instructions d’installation pour l’extension Intl se trouvent dans cette réponse distincte .

66
Nic Wortel

n'oubliez pas

@ORM\HasLifecycleCallbacks ()

Entity:

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

        return $this;
    }

Voir:

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

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

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

Pour une date complète, y compris le décalage du fuseau horaire.

2
Venkat Kotra

vous pouvez rendre de la manière suivante

{{post.published_at | date ("m/j/Y")}}

Pour plus de détails peuvent visiter http://twig.sensiolabs.org/doc/filters/date.html

2
Zaheer Babar

Il existe un outil symfony2 pour afficher la date dans les paramètres régionaux actuels:

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

Je sais que la question est assez ancienne, mais j’ai trouvé la question aujourd’hui, mais les réponses n’étaient pas ce dont j’avais besoin.

Alors voici ce dont j'avais besoin.

Si vous, comme moi , souhaitez afficher la date actuelle dans twig, vous pouvez utiliser le Suivant:

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

Voir la documentation à ce sujet:

date en brindille

1
Refilon