如何在树枝模板中呈现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;

这是我得到的错误信息:

在渲染“BeerBundle:Games:gameTable.html”中的模板(“可捕获的致命错误:类DateTime的对象无法转换为字符串……\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php第33行”)时抛出了一个异常。第10行。

259751 次浏览

你可以使用date过滤器:

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

虽然你可以用

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

方法,请记住,此版本不尊重用户区域,对于仅由一个国籍的用户使用的站点,这应该不是问题。国际用户应该显示完全不同的游戏日期,如扩展\DateTime类,并添加__toString()方法,检查地区和相应的行动。

编辑:

正如@Nic在评论中指出的那样,如果你使用Twig的Intl扩展,你将有一个可用的localizeddate过滤器,它显示了用户地区的日期。这样你就可以放弃我之前扩展\DateTime的想法。

有一个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

不要忘记

@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

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

完整的日期时间字符串,包括时区偏移。

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

静态日期格式

如果你想显示一个静态格式,它对所有地区都是相同的(例如Atom提要的ISO 8601),你应该使用Twig的date过滤器:

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

它总是以以下格式返回一个datetime:

2014 - 05 - 02 - t08: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_formattime_format,可以使用以下字符串之一:

  • 'none'如果你不想包含这个元素
  • 'short'表示最简略的样式(在英语地区是12/13/52或3:30pm)
  • 'medium' for medium样式(1952年1月12日在英语地区)
  • 'long' for long style(1952年1月12日或3:30:32pm在英语地区)
  • 'full'用于完全指定的样式(在英语地区,周二,April 12,1952 AD或3:30:42pm PST)

例子

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

\{\{ 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扩展的安装说明可以在这是单独的答案中找到。

你可以用以下方法渲染

\{\{post. publhed_at |date("m/d/Y")}}

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

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

这就是我需要的。

如果你像我这样的想要在twig中显示当前的日期,你可以使用以下方法:

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

请参阅相关文档:

date in twig

为了避免null值错误,可以使用以下代码:

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

可以使用twig的函数date和ternary操作符

\{\{ game.gameDate ? game.gameDate|date('d-m-Y H:i') : 'Not Available' }}

新的format_datetime过滤器(2022)

在树枝3中,使用format_datetime过滤器

它还支持本地化和定制模式(ICU)


{# 07/08/2019 #}
\{\{ '2019-08-07 23:39:12'|format_datetime('short', 'none', locale='fr') }}


{# mercredi 7 août 2019 23:39:12 UTC #}
\{\{ '2019-08-07 23:39:12'|format_datetime('full', 'full', locale='fr') }}


来源:https://twig.symfony.com/doc/3.x/filters/format_datetime.html