如何在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扩展 ,您将拥有一个可用的localizeddate
datefilter,它在用户的区域设置中显示date。 这样你可以放弃以前的想法延长\DateTime
。
你可以使用date
filter:
{{ game.gameDate|date("m/d/Y") }}
这取决于你想要显示date的格式。
静态date格式
如果你想要显示一个静态的格式,对于所有的语言环境来说都是一样的(例如用于Atom提要的ISO 8601 ),你应该使用Twig的date
filter :
{{ game.gameDate|date('Ymd\\TH:i:sP') }}
哪一个会通过以下格式返回一个date时间:
2014-05-02T08:55:41Z
date
filter接受的格式string与您用于PHP的date()
函数的格式string相同。 (唯一的区别是,据我所知,你不能使用PHP date()
函数中可以使用的预定义常量)
本地化date(和时间)
但是,由于您要在浏览器中呈现它,因此您可能希望以可读的格式显示该格式,并根据用户的语言和位置进行本地化。 您可以使用Intl Extension for this(使用PHP的IntlDateFormatter )来代替本地化 。 它提供了一个filterlocalizeddate
,它将使用本地化的格式输出date和时间。
localizeddate( date_format, time_format [, locale ] )
localizeddate
date的参数:
-
date_format
: 格式string之一 (见下文) -
time_format
:其中一种格式string (见下文) -
locale
:(可选)使用此选项覆盖已configuration的区域设置。 保留这个参数来使用默认的语言环境,可以在Symfony的configuration中configuration。
(还有更多,请参阅文档以获取可能参数的完整列表)
对于date_format
和time_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:52
为nl
语言环境; -
6 février 2014 10:52
forfr
locale; -
6. Februar 2014 10:52
为de
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
{{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00
包含时区偏移的完整date时间string。
您可以按照以下方式进行渲染
{{post.published_at | date(“m / d / Y”)}}
我知道这是一个很老的问题,但是我今天发现了这个问题,但答案并不是我所需要的。
所以这就是我所需要的。
如果你像我一样 ,正在寻找显示当前的date,你可以使用以下内容:
{{ "now"|date("m/d/Y") }}
看到关于这个文件:
date在树枝