Comment rendre un objet DateTime dans un modèle de brindille

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

Comment puis-je convertir ce champ en une chaîne à rendre 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 de ma classe d'entité:

/**
 * @var date $gameDate
 *
 * @ORMColumn(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 ...appcachedevtwig9bannonces58fd3bb1517632badf1fdc7fa4a8.PHP ligne 33") dans " BeerBundle: jeux: gameTable.HTML.brindille" à la ligne 10.

192
demandé sur gvlasov 2011-11-30 02:54:33

8 réponses

Bien que vous puissiez utiliser le

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

Approche, gardez à l'esprit que cette version n'honore pas les paramètres régionaux de l'utilisateur, ce qui ne devrait pas poser de problème avec un site utilisé uniquement par des utilisateurs d'une nationalité. Les utilisateurs internationaux doivent afficher la date du jeu totalement différente, comme étendre la classe \DateTime et y ajouter une méthode __toString() qui vérifie les paramètres régionaux et agit en conséquence.

Modifier :

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

268
répondu GergelyPolonkai 2017-06-16 15:37:15

Vous pouvez utiliser date filtre:

{{ game.gameDate|date("m/d/Y") }}
84
répondu Ondrej Slinták 2011-11-29 22:56:17

Cela dépend du format que vous voulez que la date soit affichée.

Format de date statique

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

{{ 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 filtre date sont les mêmes que vous utiliseriez pour la 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

Cependant, puisque vous voulez 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 PHP IntlDateFormatter ). Il fournit un filtre localizeddate qui affichera la date et l'heure en utilisant un format localisé.

localizeddate( date_format, time_format [, locale ] )

Arguments pour localizeddate:

  • date_format: une des chaînes de format (voir ci-dessous)
  • time_format: 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 pour utiliser les paramètres régionaux par défaut, qui peuvent être configurés dans 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 3:30pm dans une langue anglaise)
  • Le style Moyen (12 janvier 1952 dans une langue anglaise)
  • 'long' pour le style long (12 janvier, 1952 ou 3: 30: 32pm dans un local anglais)
  • 'full' pour le style complètement spécifié (mardi, avril 12, 1952 AD ou 3: 30: 42pm PST dans un local anglais)

Exemple

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

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

Toutefois, si vous utilisez une autre locale, le résultat sera localisé pour cette locale:

  • 6 februari 2014 10:52 pour le nl paramètres régionaux;
  • 6 février 2014 10:52 pour les paramètres régionaux fr;
  • 6. Februar 2014 10:52 pour les paramètres régionaux de ; etc.

Comme vous pouvez le voir, {[7] } 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éerlandaises, françaises et allemandes la placent 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 minuscules. Et les dates allemandes ont un point annexer.

Installation / réglage des paramètres régionaux

Les instructions D'Installation de L'extension Intl se trouvent dans cette réponse séparée .

65
répondu Nic Wortel 2017-08-11 16:01:58

Ne pas oublier

@ 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

3
répondu Ivan 2013-09-18 14:30:23

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
répondu ihsan 2013-09-07 10:14:57
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

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

2
répondu Venkat Kotra 2014-02-06 16:48:29

Vous pouvez rendre de la manière suivante

{{ poste.published_at / date ("m / J / A") }}

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

2
répondu Zaheer Babar 2014-12-10 12:28:15

Je sais que c'est une question assez ancienne, 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 dateactuelle dans twig, vous pouvez utiliser ce qui suit:

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

Voir la documentation à ce sujet:

Date en brindille

0
répondu Refilon 2017-06-24 22:47:33