Como renderizar um objeto DateTime em um modelo Twig

215

Um dos meus campos em uma das minhas entidades é uma variável "datetime".

Como posso converter esse campo em uma string para renderizar em um navegador?

Aqui está um trecho de código:

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

Aqui está a variável na minha classe de entidade:

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

E aqui está a mensagem de erro que estou recebendo:

Uma exceção foi lançada durante a renderização de um modelo ("Erro fatal capturável: o objeto da classe DateTime não pôde ser convertido em seqüência de caracteres em ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php linha 33" ) em "BeerBundle: Games: gameTable.html.twig" na linha 10.

Chris Ridmann
fonte

Respostas:

305

Embora você possa usar o

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

abordagem, lembre-se de que esta versão não respeita a localidade do usuário, o que não deve ser um problema para um site usado apenas por usuários de uma nacionalidade. Usuários internacionais devem exibir a data do jogo totalmente diferente, como estender a \DateTimeclasse e adicionar um __toString()método que verifique a localidade e aja de acordo.

Editar :

Conforme apontado por @Nic em um comentário, se você usar a extensão Intl do Twig , você terá um localizeddatefiltro disponível, que mostra a data na localidade do usuário. Dessa forma, você pode descartar minha ideia anterior de estender \DateTime.

GergelyPolonkai
fonte
45
{{ game.gameDate|date('Y-m-d H:i:s') }}para data e hora. Eu tive problemas para encontrar caráter por minutos.
Murko
6
A função de data do Twig usa o mesmo formato da função php (nos documentos do Twig). Para quem procura outros formatos, php.net/manual/en/function.date.php .
Jonnys
9
Cuidado com os valores nulos; em um caso de uso semelhante, estou vendo a data de hoje ao canalizar um valor nulo para a datefunção Twig . Com base no seu exemplo, você precisará envolvê-lo em:{% if game.gameDate is not empty %} ... {%endif}
fazy 28/08
4
Quanto à localização, você não deve estender a DateTimeclasse! Em vez disso, basta usar o localizeddatefiltro para Twig .
Nic Wortel
1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}seria sugerido
Dheeraj 5/16
90

Você pode usar o datefiltro:

{{ game.gameDate|date("m/d/Y") }}
Ondrej Slinták
fonte
3
Concordo totalmente com você. É algo que deveria estar lá por padrão.
Tftd
2
@ThomasDecaux que na verdade não é tão estranho, porque um __toString()método precisaria saber para qual formato converter o DateTimeobjeto e provavelmente existem centenas de formatos possíveis por aí. Obviamente, no PHP você pode usar o format()método em um DateTimeobjeto, que recebe um argumento de formato, e o datefiltro é simplesmente o equivalente do Twig a esse método.
precisa
68

Depende do formato em que você deseja que a data seja mostrada.

Formato de data estática

Se você deseja exibir um formato estático, o mesmo para todos os locais (por exemplo, ISO 8601 para um feed Atom), você deve usar o datefiltro do Twig :

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

O que sempre retornará uma data e hora no seguinte formato:

2014-05-02T08: 55: 41Z

As strings de formato aceitas pelo datefiltro são as mesmas que você usaria para a date()função do PHP . (a única diferença é que, até onde eu sei, você não pode usar as constantes predefinidas que podem ser usadas na date()função PHP )

Datas (e horários) localizados

No entanto, como você deseja renderizá-lo no navegador, provavelmente o mostrará em um formato legível por humanos, localizado para o idioma e o local do usuário. Em vez de fazer a localização, você pode usar a Extensão Intl para isso (que faz uso do IntlDateFormatter do PHP ). Ele fornece um filtro localizeddateque exibirá a data e a hora usando um formato localizado.

localizeddate( date_format, time_format [, locale ] )

Argumentos para localizeddate:

  • date_format: Uma das cadeias de formato (veja abaixo)
  • time_format: Uma das cadeias de formato (veja abaixo)
  • locale: (opcional) Use isso para substituir o código do idioma configurado. Deixe esse argumento de fora para usar o código do idioma padrão, que pode ser configurado na configuração do Symfony.

(há mais, consulte os documentos para obter a lista completa de argumentos possíveis)

Para date_formate time_formatvocê pode usar uma das seguintes seqüências de caracteres:

  • 'none' se você não quiser incluir esse elemento
  • 'short' para o estilo mais abreviado (13/12/52 ou 15:30 em um código de idioma inglês)
  • 'medium' para o estilo médio (12 de janeiro de 1952 em um código de idioma inglês)
  • 'long' para o estilo longo (12 de janeiro de 1952 ou 15:30:32 em um código de idioma inglês)
  • 'full' para o estilo completamente especificado (terça-feira, 12 de abril de 1952 dC ou 15:30:42 pm PST em um código de idioma inglês)

Exemplo

Portanto, por exemplo, se você deseja exibir a data em um formato equivalente a February 6, 2014 at 10:52 AM, use a seguinte linha no seu modelo Twig:

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

No entanto, se você usar um código de idioma diferente, o resultado será localizado para esse código de idioma:

  • 6 februari 2014 10:52para a nllocalidade;
  • 6 février 2014 10:52para a frlocalidade;
  • 6. Februar 2014 10:52para a delocalidade; etc.

Como você pode ver, localizeddatenão apenas traduz os nomes dos meses, mas também usa as notações locais. A notação em inglês coloca a data após o mês, onde as notações em holandês, francês e alemão a colocam antes do mês. Os nomes dos meses em inglês e alemão começam com uma letra maiúscula, enquanto os nomes dos meses em holandês e francês são minúsculos. E as datas alemãs têm um ponto acrescentado.

Instalação / configuração do código do idioma

As instruções de instalação para a extensão Intl podem ser encontradas nesta resposta separada .

Nic Wortel
fonte
1
Datas (e horários) localizadas - muito obrigado por esse @Nic - incrível!
WebDEVILopers
Oi, usando localizeddate, você sabe como gerar apenas M e Y (não dia)? thks
mario
3

Não esqueça

@ORM \ HasLifecycleCallbacks ()

Entidade:

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

        return $this;
    }

Visão:

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

>> Saída 2013-09-18 16:14:20

Ivan
fonte
2

Existe uma ferramenta symfony2 para exibir a data no local atual:

{{ 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
fonte
2
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

Para a seqüência de tempo completo da data, incluindo o deslocamento do fuso horário.

Venkat Kotra
fonte
1

Sei que essa é uma pergunta bastante antiga, mas a encontrei hoje, mas as respostas não eram o que eu precisava.

Então aqui está o que eu precisava.

Se você, como eu , procura exibir a data atual em galho, pode usar o seguinte:

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

Consulte a documentação sobre isso:

data em galho

Refilon
fonte
0

Para evitar erro no valor nulo, você pode usar este código:

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