Comment rendre un objet DateTime dans un modèle Twig

215

Un de mes champs dans une de mes entités est une variable "datetime".

Comment puis-je convertir ce champ en une 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 fatale 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.

Chris Ridmann
la source

Réponses:

305

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 être un problème avec un site utilisé par des utilisateurs d'une seule nationalité. Les utilisateurs internationaux doivent afficher la date du jeu de manière totalement différente, comme étendre la \DateTimeclasse et y ajouter une __toString()méthode qui vérifie les paramètres régionaux et agit en conséquence.

Modifier :

Comme l'a souligné @Nic dans un commentaire, si vous utilisez l' extension Intl de Twig , vous aurez un localizeddatefiltre disponible, 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'extension \DateTime.

GergelyPolonkai
la source
45
{{ game.gameDate|date('Y-m-d H:i:s') }}pour la date et l'heure. J'ai eu des problèmes pour trouver du personnage pendant quelques minutes.
murko
6
La fonction de date de Twig utilise le même format que la fonction php (à partir des documents Twig). Pour tous ceux qui recherchent d'autres formats, php.net/manual/en/function.date.php .
JonnyS
9
Attention aux valeurs nulles; dans un cas d'utilisation similaire, je vois la date d'aujourd'hui lors du transfert d'une valeur nulle à la datefonction de Twig . Sur la base de votre exemple, vous devrez l'envelopper{% if game.gameDate is not empty %} ... {%endif}
fazy
4
Quant à la localisation, vous ne devriez pas étendre la DateTimeclasse! À la place, utilisez simplement le localizeddatefiltre pour Twig .
Nic Wortel
1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}serait suggéré
Dheeraj
90

Vous pouvez utiliser le datefiltre:

{{ game.gameDate|date("m/d/Y") }}
Ondrej Slinták
la source
3
Totalement d'accord avec toi. C'est quelque chose qui devrait être là par défaut.
tftd
2
@ThomasDecaux ce n'est pas si étrange du tout, car une __toString()méthode aurait besoin de savoir dans quel format convertir l' DateTimeobjet, et il existe probablement des centaines de formats possibles. Bien sûr, en PHP, vous pouvez utiliser la format()méthode sur un DateTimeobjet, qui prend un argument de format, et le datefiltre est simplement l'équivalent Twig de cette méthode.
Nic Wortel
68

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

Format de date statique

Si vous souhaitez afficher un format statique, qui est le même pour tous les paramètres régionaux (par exemple ISO 8601 pour un flux Atom), vous devez utiliser le datefiltre de Twig :

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

Qui retournera toujours un datetime au format suivant:

2014-05-02T08: 55: 41Z

Les chaînes de format acceptées par le datefiltre sont les mêmes que celles que vous utiliseriez pour la date()fonction 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 date()fonction PHP )

Dates (et heures) localisées

Cependant, puisque vous souhaitez le rendre dans le navigateur, vous voudrez 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 l' extension Intl pour cela (qui utilise IntlDateFormatter de PHP ). Il fournit un filtre localizeddatequi affichera la date et l'heure en utilisant un format localisé.

localizeddate( date_format, time_format [, locale ] )

Arguments pour localizeddate:

  • date_format: L'une des chaînes de format (voir ci-dessous)
  • time_format: L'une des chaînes de format (voir ci-dessous)
  • locale: (facultatif) Utilisez ceci pour remplacer les paramètres régionaux configurés. Laissez cet argument en dehors 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 la documentation pour la liste complète des arguments possibles)

Pour date_formatet time_formatvous 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é (13/12/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 AD ou 15h30:42 PST 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') }}

Cependant, si vous utilisez un environnement local différent, le résultat sera localisé pour cet environnement local:

  • 6 februari 2014 10:52pour les nlparamètres régionaux;
  • 6 février 2014 10:52pour les frparamètres régionaux;
  • 6. Februar 2014 10:52pour les deparamètres régionaux; etc.

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

Installation / configuration des paramètres régionaux

Les instructions d'installation de l'extension Intl se trouvent dans cette réponse séparée .

Nic Wortel
la source
1
Dates (et heures) localisées - merci beaucoup pour ce @Nic - génial!
webDEVILopers
Salut, en utilisant localizeddate, savez-vous comment sortir uniquement M et Y (pas le jour)? thks
mario
3

N'oubliez pas

@ORM \ HasLifecycleCallbacks ()

Entité:

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

        return $this;
    }

Vue:

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

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

Ivan
la source
2

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

ihsan
la source
2
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

Pour la chaîne d'heure de date complète, y compris le décalage du fuseau horaire.

Venkat Kotra
la source
1

Je sais que c'est une assez vieille question, mais j'ai trouvé cette question aujourd'hui, mais les réponses n'étaient pas ce dont j'avais besoin.

Voici donc ce dont j'avais besoin.

Si vous, comme moi , cherchez à afficher la date actuelle en brindille, vous pouvez utiliser ce qui suit:

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

Voir la documentation à ce sujet:

date en brindille

Refilon
la source
0

Pour éviter une erreur sur la valeur nulle, vous pouvez utiliser ce code:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Arnold Richmon
la source