如何在Twig模板中呈现DateTime对象

我的一个实体中的一个字段是“date时间”variables。

如何将此字段转换为string以在浏览器中呈现?

这是一个代码片段:

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

这是我的实体类中的variables:

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

这里是我得到的错误消息:

在呈现模板期间抛出exception(“可捕获的致命错误:类DateTime的对象无法转换为… \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php第33行中的string” )在第10行的“BeerBundle:Games:gameTable.html.twig”中。

虽然你可以使用

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

请记住,此版本不尊重用户区域设置,对于只有一个国籍用户使用的站点,这不应该是一个问题。 国际用户应该显示完全不同的游戏date,比如扩展\DateTime类,并添加一个__toString()方法来检查语言环境并相应地执行。

编辑

正如@Nic在评论中指出的那样,如果您使用Twig的Intl扩展 ,您将拥有一个可用的localizeddatedatefilter,它在用户的区域设置中显示date。 这样你可以放弃以前的想法延长\DateTime

你可以使用datefilter:

 {{ game.gameDate|date("m/d/Y") }} 

这取决于你想要显示date的格式。

静态date格式

如果你想要显示一个静态的格式,对于所有的语言环境来说都是一样的(例如用于Atom提要的ISO 8601 ),你应该使用Twig的datefilter :

 {{ game.gameDate|date('Ymd\\TH:i:sP') }} 

哪一个会通过以下格式返回一个date时间:

2014-05-02T08:55:41Z

datefilter接受的格式string与您用于PHP的date()函数的格式string相同。 (唯一的区别是,据我所知,你不能使用PHP date()函数中可以使用的预定义常量)

本地化date(和时间)

但是,由于您要在浏览器中呈现它,因此您可能希望以可读的格式显示该格式,并根据用户的语言和位置进行本地化。 您可以使用Intl Extension for this(使用PHP的IntlDateFormatter )来代替本地化 。 它提供了一个filterlocalizeddate ,它将使用本地化的格式输出date和时间。

 localizeddate( date_format, time_format [, locale ] ) 

localizeddatedate的参数:

  • date_format : 格式string之一 (见下文)
  • time_format :其中一种格式string (见下文)
  • locale :(可选)使用此选项覆盖已configuration的区域设置。 保留这个参数来使用默认的语言环境,可以在Symfony的configuration中configuration。

(还有更多,请参阅文档以获取可能参数的完整列表)

对于date_formattime_format您可以使用以下string之一:

  • 如果你不想包含这个元素,则为'none'
  • 最简短的风格'short' (英语区域12/13/52或3:30 pm)
  • 中等风格的'medium' (1952年1月12日,英国语言环境)
  • 漫长的风格(1952年1月12日或3:30:32在英语区域)
  • 完全指定的样式(1952年4月12日星期二或者PST在英国语言区域3:30:42)

因此,例如,如果要以等效于February 6, 2014 at 10:52 AM的格式显示date,请在Twig模板中使用以下行:

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

但是,如果您使用不同的语言环境,则会针对该语言环境对结果进行本地化:

  • 6 februari 2014 10:52nl语言环境;
  • 6 février 2014 10:52 for fr locale;
  • 6. Februar 2014 10:52de locale; 等等

正如你所看到的, localizeddate不仅可以翻译月份名称,还可以使用本地符号。 英语符号表示月份之后的date,荷兰语,法语和德语符号在月份之前表示。 英文和德文月份名称以大写字母开头,而荷兰和法国月份名称则为小写。 而德国的date有一个点附加。

安装/设置语言环境

Intl扩展的安装说明可以在这个单独的答案中find。

别忘了

@ORM \ HasLifecycleCallbacks()

实体 :

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

视图:

 {{ item.gameDate|date('Ymd H:i:s') }} 

>>输出2013-09-18 16:14:20

有一个symfony2工具来显示当前的语言环境中的date:

 {{ 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

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

包含时区偏移的完整date时间string。

您可以按照以下方式进行渲染

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

有关更多详情,请访问http://twig.sensiolabs.org/doc/filters/date.html

我知道这是一个很老的问题,但是我今天发现了这个问题,但答案并不是我所需要的。

所以这就是我所需要的。

如果你像我一样 ,正在寻找显示当前的date,你可以使用以下内容:

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

看到关于这个文件:

date在树枝