我的一个实体中的一个字段是“日期时间”变量。
如何将此字段转换为字符串以在浏览器中呈现?
这是一个代码片段:
{% 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\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php 第 33 行中的字符串” ) 在第 10 行的“BeerBundle:Games:gameTable.html.twig”中。
虽然您可以使用
{{ game.gameDate|date('Y-m-d') }}
方法,请记住,此版本不尊重用户区域设置,这对于仅由一个国家的用户使用的站点应该不是问题。国际用户应该显示完全不同的游戏日期,例如扩展 \DateTime
类,并向其添加 __toString()
方法来检查区域设置并采取相应措施。
编辑:
正如@Nic 在评论中指出的那样,如果您使用 Intl extension of Twig,您将有一个可用的 localizeddate
过滤器,它在用户的区域设置中显示日期。这样您就可以放弃我之前扩展 \DateTime
的想法。
这取决于您希望日期显示为的格式。
静态日期格式
如果您想显示一种静态格式,这对于所有语言环境都相同(例如,Atom 提要的 ISO 8601),您应该使用 Twig 的 date
filter:
{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}
这将始终以以下格式返回日期时间:
2014-05-02T08:55:41Z
date
过滤器接受的格式字符串与用于 PHP's date()
function 的格式字符串相同。 (唯一的区别是,据我所知,您不能使用可在 PHP date()
函数中使用的预定义常量)
本地化日期(和时间)
但是,由于您想在浏览器中呈现它,您可能希望以人类可读的格式显示它,并针对用户的语言和位置进行本地化。您可以为此使用 Intl Extension(利用 PHP 的 IntlDateFormatter),而不是自己进行本地化。它提供了一个过滤器 localizeddate
,它将使用本地化格式输出日期和时间。
localizeddate( date_format, time_format [, locale ] )
localizeddate
的参数:
date_format:格式字符串之一(见下文)
time_format:格式字符串之一(见下文)
语言环境:(可选)使用它来覆盖配置的语言环境。保留这个参数以使用默认语言环境,可以在 Symfony 的配置中进行配置。
(还有更多,请参阅 the docs 了解可能参数的完整列表)
对于 date_format
和 time_format
,您可以使用以下字符串之一:
'none' 如果你不想包含这个元素
'short' 表示最缩写的样式(英语语言环境中的 12/13/52 或下午 3:30)
'medium' 表示中等风格(1952 年 1 月 12 日在英语语言环境中)
'long' 表示长样式(1952 年 1 月 12 日或英语语言环境中的下午 3:30:32)
'full' 表示完全指定的样式(1952 年 4 月 12 日星期二或太平洋标准时间下午 3:30:42,英语语言环境)
例子
因此,例如,如果您想以等效于 February 6, 2014 at 10:52 AM
的格式显示日期,请在 Twig 模板中使用以下行:
{{ game.gameDate|localizeddate('long', 'short') }}
但是,如果您使用不同的语言环境,则结果将针对该语言环境进行本地化:
2014 年 2 月 6 日 10:52 用于 nl 语言环境;
6 février 2014 10:52 for the fr locale;
6. 2014 年 2 月 10:52 为 de locale;等等
如您所见,localizeddate
不仅翻译月份名称,还使用本地符号。英文表示法将日期放在月份之后,而荷兰语、法语和德语表示法将日期放在月份之前。英语和德语月份名称以大写字母开头,而荷兰语和法语月份名称以小写字母开头。德语日期附加了一个点。
安装/设置语言环境
可在 this seperate answer 中找到 Intl 扩展的安装说明。
我知道这是一个很老的问题,但我今天发现了这个问题,但答案不是我需要的。
所以这就是我需要的。
如果您像我一样希望在 twig 中显示当前日期,您可以使用以下命令:
{{ "now"|date("m/d/Y") }}
请参阅有关此的文档:
为避免空值错误,您可以使用以下代码:
{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
不要忘记
@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
{{game.gameDate | date('c')}} // 2014-02-05T16:45:22+00:00
对于完整的日期时间字符串,包括时区偏移量。
有一个 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
https://github.com/michelsalib/BCCExtraToolsBundle
您可以通过以下方式渲染
{{ post.published_at|date("m/d/Y") }}
更多详情可以访问http://twig.sensiolabs.org/doc/filters/date.html
您可以使用 twig
的函数日期和 ternary
运算符
{{ game.gameDate ? game.gameDate|date('d-m-Y H:i') : 'Not Available' }}
不定期副业成功案例分享
{{ game.gameDate|date('Y-m-d H:i:s') }}
用于日期和时间。我在几分钟内找不到角色。date
函数时,我看到了今天的日期。根据您的示例,您需要将其包装在{% if game.gameDate is not empty %} ... {%endif}
DateTime
类!相反,simply use thelocalizeddate
filter for Twig。{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}
将被建议