ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Twig 模板中呈现 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\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php 第 33 行中的字符串” ) 在第 10 行的“BeerBundle:Games:gameTable.html.twig”中。


G
GergelyPolonkai

虽然您可以使用

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

方法,请记住,此版本不尊重用户区域设置,这对于仅由一个国家的用户使用的站点应该不是问题。国际用户应该显示完全不同的游戏日期,例如扩展 \DateTime 类,并向其添加 __toString() 方法来检查区域设置并采取相应措施。

编辑:

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


{{ game.gameDate|date('Y-m-d H:i:s') }} 用于日期和时间。我在几分钟内找不到角色。
Twig 的日期函数使用与 php 函数相同的格式(来自 Twig 文档)。对于寻找其他格式的任何人,php.net/manual/en/function.date.php
注意空值;在类似的用例中,当将空值传递给 Twig 的 date 函数时,我看到了今天的日期。根据您的示例,您需要将其包装在 {% if game.gameDate is not empty %} ... {%endif}
至于本地化,您不应该扩展 DateTime 类!相反,simply use the localizeddate filter for Twig
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %} 将被建议
O
Ondrej Slinták

您可以使用 date 过滤器:

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

完全同意你的看法。这是默认情况下应该存在的东西。
@ThomasDecaux 实际上一点也不奇怪,因为 __toString() 方法需要知道将 DateTime 对象转换为哪种格式,并且可能有数百种可能的格式。当然,在 PHP 中,您可以在 DateTime 对象上使用 format() 方法,该对象采用格式参数,而 date 过滤器只是该方法的 Twig 等效项。
N
Nic Wortel

这取决于您希望日期显示为的格式。

静态日期格式

如果您想显示一种静态格式,这对于所有语言环境都相同(例如,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_formattime_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 扩展的安装说明。


本地化日期(和时间) - 非常感谢@Nic - 太棒了!
嗨,使用本地化日期,你知道如何只输出 M 和 Y(不是日期)吗?谢谢
如果您正在为输入类型“datetime-local”填充时间以在 TWIG 中正确呈现,请使用 Ymd\\TH:i
R
Refilon

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

所以这就是我需要的。

如果您像我一样希望在 twig 中显示当前日期,您可以使用以下命令:

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

请参阅有关此的文档:

date in twig


这正是我一直在寻找的。谢谢!
A
Arnold Richmon

为避免空值错误,您可以使用以下代码:

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

I
Ivan

不要忘记

@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


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

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


i
ihsan

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


Z
Zaheer Babar

您可以通过以下方式渲染

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

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


L
L3xpert

您可以使用 twig 的函数日期和 ternary 运算符

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