Cómo representar un objeto DateTime en una plantilla Twig

215

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

¿Cómo puedo convertir este campo en una cadena para representar 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 recibo:

Se ha producido una excepción durante el renderizado de una plantilla ("Error fatal capturable: el objeto de la clase DateTime no se pudo convertir en cadena en ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php línea 33" ) en "BeerBundle: Games: gameTable.html.twig" en la línea 10.

Chris Ridmann
fuente

Respuestas:

305

Aunque puedes usar el

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

enfoque, tenga en cuenta que esta versión no respeta la configuración regional del usuario, 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 \DateTimeclase y agregarle un __toString()método que verifique la configuración regional y actúe en consecuencia.

Editar :

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

GergelyPolonkai
fuente
45
{{ game.gameDate|date('Y-m-d H:i:s') }}para fecha y hora. Tuve problemas para encontrar el personaje por minutos.
murko
66
La función de fecha de Twig usa el mismo formato que la función php (de los documentos de Twig). Para cualquiera que busque otros formatos, php.net/manual/en/function.date.php .
JonnyS
99
Cuidado con los valores nulos; en un caso de uso similar, veo la fecha de hoy cuando canalizo un valor nulo a la datefunción de Twig . Según su ejemplo, tendrá que envolverlo{% if game.gameDate is not empty %} ... {%endif}
fabuloso
44
En cuanto a la localización, ¡no deberías extender la DateTimeclase! En cambio, simplemente use el localizeddatefiltro para Twig .
Nic Wortel
1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}sería sugerido
Dheeraj
90

Puedes usar datefilter:

{{ game.gameDate|date("m/d/Y") }}
Ondrej Slinták
fuente
3
Totalmente de acuerdo contigo. Es algo que debería estar allí por defecto.
tftd
2
@ThomasDecaux en realidad no es tan extraño en absoluto, porque un __toString()método necesitaría saber a qué formato convertir el DateTimeobjeto, y probablemente hay cientos de formatos posibles por ahí. Por supuesto, en PHP puede usar el format()método en un DateTimeobjeto, que toma un argumento de formato, y el datefiltro es simplemente el equivalente de Twig de ese método.
Nic Wortel
68

Depende del formato en 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 un feed Atom), debe usar el datefiltro Twig :

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

Que siempre devolverá una fecha y hora en el siguiente formato:

2014-05-02T08: 55: 41Z

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

Fechas localizadas (y horas)

Sin embargo, dado que desea representarlo 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 IntlDateFormatter de PHP ). Proporciona un filtro localizeddateque generará la fecha y la hora utilizando un formato localizado.

localizeddate( date_format, time_format [, locale ] )

Argumentos a favor de 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 la configuración de Symfony.

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

Para date_formaty time_formatpuede usar una de las siguientes cadenas:

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

Ejemplo

Entonces, 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 Twig:

{{ 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:52para el nllocal;
  • 6 février 2014 10:52para el frlocal;
  • 6. Februar 2014 10:52para el delocal; etc.

Como puedes ver, localizeddate no solo traduce los nombres de los meses, sino que también usa las anotaciones locales. La notación inglesa pone la fecha después del mes, donde las anotaciones holandesas, francesas y alemanas la colocan antes del mes. Los nombres de mes en inglés y alemán comienzan con una letra mayúscula, mientras que los nombres de mes en holandés y francés están en minúscula. Y las fechas alemanas tienen un punto adjunto.

Instalación / configuración del entorno local

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

Nic Wortel
fuente
1
Fechas localizadas (y horarios) - muchas gracias por este @Nic - ¡increíble!
webDEVILopers
Hola, usando fecha localizada, ¿sabes cómo generar solo M e Y (no día)? thks
mario
3

No olvides

@ORM \ HasLifecycleCallbacks ()

Entidad:

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

        return $this;
    }

Ver:

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

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

Ivan
fuente
2

Hay una herramienta de Symfony2 para mostrar la fecha en el entorno local 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

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

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

Venkat Kotra
fuente
1

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

Entonces esto es lo que necesitaba.

Si, como yo , desea mostrar la fecha actual en rama, puede usar lo siguiente:

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

Ver documentación sobre esto:

fecha en ramita

Refilon
fuente
0

Para evitar errores en el valor nulo, puede usar este código:

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