Cómo renderizar un objeto DateTime en una plantilla Twig


Uno de mis campos en una de mis entidades es una variable "datetime".

¿Cómo puedo convertir este campo en una cadena para renderizar en un navegador?

Aquí hay un fragmento de código:

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

Aquí está la variable en mi clase de entidad:

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

Y aquí está el mensaje de error que estoy recibiendo:

Se ha lanzado una excepción durante el renderizado de una plantilla ("Catchable Fatal Error: Object of class DateTime could not be converted to string in ...\ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php line 33") en " BeerBundle: Games: gameTable.HTML.ramita " en la línea 10.

Author: gvlasov, 2011-11-30

8 answers

Aunque se puede utilizar el

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

Enfoque, tenga en cuenta que esta versión no respeta la configuración regional del usuario, lo que no debería ser un problema con un sitio utilizado solo por usuarios de una nacionalidad. Los usuarios internacionales deben mostrar la fecha del juego totalmente diferente, como extender la clase \DateTime y agregar un método __toString() que verifique la configuración regional y actúe en consecuencia.

Edit :

Como señaló @Nic en un comentario, si usa la extensión Intl de Twig , tendrá un filtro localizeddate disponible, que muestra la fecha en la configuración regional del usuario. De esta manera puedes dejar de lado mi idea anterior de extender \DateTime.

 268
Author: GergelyPolonkai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 15:37:15

Puede utilizar date filtro:

{{ game.gameDate|date("m/d/Y") }}
 84
Author: Ondrej Slinták,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 22:56:17

Depende del formato con el que desea que se muestre la fecha.

Formato de fecha estática

Si desea mostrar un formato estático, que es el mismo para todas las configuraciones regionales (por ejemplo ISO 8601 para una alimentación Atom), debe usar Twig's date filtro :

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

Que siempre devuelven un datetime en el siguiente formato:

2014-05-02T08:55:41Z

Las cadenas de formato aceptadas por el filtro date son las mismas que se usaría para la función date() de PHP . (la única diferencia es que, por lo que sé, no se pueden usar las constantes predefinidas que se pueden usar en la función PHP date())

Fechas localizadas (y horas)

Sin embargo, dado que desea renderizarlo en el navegador, es probable que desee mostrarlo en un formato legible por humanos, localizado para el idioma y la ubicación del usuario. En lugar de hacer la localización usted mismo, puede usar la extensión Intl para esto (que hace uso de PHP IntlDateFormatter). Proporciona un filtro localizeddate que mostrará la fecha y la hora utilizando un formato localizado.

localizeddate( date_format, time_format [, locale ] )

Argumentos para localizeddate:

  • date_format: Una de las cadenas de formato (ver más abajo)
  • time_format: Una de las cadenas de formato (ver más abajo)
  • locale: (opcional) Use esto para anular la configuración regional configurada. Deje este argumento fuera para usar la configuración regional predeterminada, que se puede configurar en Configuración de Symfony.

(hay más, ver los documentos para la lista completa de posibles argumentos)

Para date_format y time_format puede usar una de las siguientes cadenas:

  • 'none' si no desea incluir este elemento
  • 'short' para el estilo más abreviado (12/13/52 o 3:30pm en un local inglés)
  • 'medium' para el estilo medium (12 de enero de 1952 en un local inglés)
  • 'long' para el estilo largo (12 de enero, 1952 o 3: 30: 32pm en un local inglés)
  • 'full' para el estilo completamente especificado (martes, 12 de abril de 1952 DC o 3: 30: 42pm PST en una configuración regional en inglés)

Ejemplo

Así que, por ejemplo, si desea mostrar la fecha en un formato equivalente a February 6, 2014 at 10:52 AM, use la siguiente línea en su plantilla de Ramita:

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

Sin embargo, si usa una configuración regional diferente, el resultado se localizará para esa configuración regional:

  • 6 februari 2014 10:52 para el nl locale;
  • 6 février 2014 10:52 para la localización fr;
  • 6. Februar 2014 10:52 para la localización de ; sucesivamente.

Como puede ver, localizeddate no solo traduce los nombres de los meses, sino que también utiliza las notaciones locales. La notación inglesa pone la fecha después del mes, mientras que las notaciones neerlandesas, francesas y alemanas la ponen antes del mes. Los nombres de los meses en inglés y alemán comienzan con una letra mayúscula, mientras que los nombres de los meses en holandés y francés son minúsculos. Y las fechas alemanas tienen un punto anexar.

Instalación / configuración regional

Las instrucciones de instalación para la extensión Intl se pueden encontrar en esta respuesta separada.

 65
Author: Nic Wortel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-11 16:01:58

No lo olvides

@Has \ HasLifecycleCallbacks ()

Entidad :

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

        return $this;
    }

Vista:

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

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

 3
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 14:30:23

Hay una herramienta symfony2 para mostrar la fecha en la configuración regional actual:

{{ 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
Author: ihsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-07 10:14:57
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

Para la cadena de fecha y hora completa incluyendo el desplazamiento de la zona horaria.

 2
Author: Venkat Kotra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-06 16:48:29

Puede renderizar de la siguiente manera

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

Para más detalles puede visitar http://twig.sensiolabs.org/doc/filters/date.html

 2
Author: Zaheer Babar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 12:28:15

Sé que esta es una pregunta bastante antigua, pero encontré esta pregunta hoy, pero las respuestas no eran lo que necesitaba.

Así que esto es lo que necesitaba.

Si usted, como yo , está buscando mostrar la fecha actual en ramita, puede usar lo siguiente:

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

Ver documentación sobre esto:

Fecha en ramita

 0
Author: Refilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-24 22:47:33