如何在树枝模板中渲染DateTime对象
题
我一个实体之一的我的字段之一是“ dateTime”变量。
如何将此字段转换为字符串以在浏览器中渲染?
这是一个代码段:
{% for game in games %}
...
<td> {{game.gameTeamIdOne.teamName}} </td>
<td> {{game.gameTeamIdTwo.teamName}} </td>
<td> {{game.gameDate}}</td>
</tr>
{% endfor %}
这是我的实体类中的变量:
/**
* @var date $gameDate
*
* @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
*/
private $gameDate;
这是我收到的错误消息:
在渲染模板的渲染过程中,已经抛出了一个例外(“可追踪的致命错误:dateTime的对象不能转换为... app cache dev twig twig 9b 9b ad ad ad 58fd3bb1517632badf1f1f1fdc7fa4a.php line 33“ )在“ BeerBundle:Games:Gametable.html.twig”第10行。
解决方案
虽然您可以使用
{{ game.gameDate|date('Y-m-d') }}
方法请记住,此版本并不尊重用户语言环境,这不应该是一个只有一个国籍用户使用的网站的问题。国际用户应显示游戏日期完全不同,例如扩展 \DateTime
上课,添加一个 __toString()
它可以检查区域并采取相应作用的方法。
编辑:
正如@nic在评论中指出的那样,如果您使用 twig的intl扩展, ,你会有一个 localizeddate
可用过滤器,显示用户语言环境中的日期。这样,您可以放弃我以前的扩展想法 \DateTime
.
其他提示
您可以使用 date
筛选:
{{ game.gameDate|date("m/d/Y") }}
这取决于您要显示的日期的格式。
静态日期格式
如果您想显示静态格式,这对所有语言端都是相同的(例如 ISO 8601 对于原子饲料),您应该使用树枝 date
筛选:
{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}
它将以以下格式返回日期时间:
2014-05-02T08:55:41Z
格式字符串 date
过滤器与您使用的过滤器相同 PHP的 date()
功能. 。 (唯一的区别是,据我所知,您不能使用可以在PHP中使用的预定义常数 date()
功能)
本地日期(和时间)
但是,由于您想在浏览器中渲染它,因此您可能希望以人的语言和位置本地化的人类可读格式显示它。您可以使用本地化,而是可以使用 INTL扩展 为此(使用PHP的 intldateFormatter)。它提供了一个过滤器 localizeddate
它将使用局部格式输出日期和时间。
localizeddate( date_format, time_format [, locale ] )
争论 localizeddate
:
date_format
: : 中的一个 格式字符串 (见下文)time_format
: : 中的一个 格式字符串 (见下文)locale
: :(可选)使用它覆盖配置的语言环境。将此参数放在使用默认场所,可以通过Symfony的配置进行配置。
(还有更多,请参阅 文档 对于可能的参数的完整列表)
为了 date_format
和 time_format
您可以使用以下字符串之一:
'none'
如果您不想包含此元素'short'
对于最缩写的风格(英语环境中的12/13/52或3:30 PM)'medium'
对于中等样式(1952年1月12日,在英语语言环境中)'long'
长时间的风格(1952年1月12日或下午3:30:32在英语语言环境中)'full'
对于完全指定的样式(1952年4月12日,星期二或PST下午3:30:42在英语语言环境中)
例子
因此,例如,如果要以等效的格式显示日期 February 6, 2014 at 10:52 AM
, ,使用树枝模板中的以下行:
{{ game.gameDate|localizeddate('long', 'short') }}
但是,如果您使用不同的语言环境,则将为该语言环境定位:
6 februari 2014 10:52
为了nl
语言环境;6 février 2014 10:52
为了fr
语言环境;6. Februar 2014 10:52
为了de
语言环境;等等
如你看到的, localizeddate
不仅会翻译这个月份的名称,还使用本地符号。英语符号将日期放在一个月之后,荷兰语,法语和德语符号将其提交给本月。英语和德语月份的名字以大写字母开头,而荷兰语和法国月份的名字是小写的。德国日期附有点。
安装 /设置语言环境
可以在INTL扩展程序的安装说明中找到 这个单独的答案.
不要忘记
@orm haslifecyclecallbacks()
实体 :
/**
* Set gameDate
*
* @ORM\PrePersist
*/
public function setGameDate()
{
$this->dateCreated = new \DateTime();
return $this;
}
看法:
{{ item.gameDate|date('Y-m-d H:i:s') }}
>>输出2013-09-18 16:14:20
有一个Symfony2工具可以在当前语言环境中显示日期:
{{ 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
对于全约日期字符串,包括时区偏移。
您可以按照以下方式渲染
{{post.published_at | date(“ m/d/y”)}}}}
我知道这是一个非常古老的问题,但是我今天发现了这个问题,但是答案不是我需要的。
所以这就是我需要的。
如果你, 像我这样的, ,正在寻找显示 当前的 在树枝中的日期,您可以使用以下内容:
{{ "now"|date("m/d/Y") }}
请参阅有关此的文档: