如何在Twig模板中呈现DateTime对象


215

我的一个实体中的一个字段是“ 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”中。

Answers:


304

虽然您可以使用

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

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

编辑

正如@Nic在评论中指出的那样,如果使用TwigIntl扩展名,则将有一个localizeddate可用的过滤器,该过滤器在用户的语言环境中显示日期。这样一来,您就可以放弃我以前扩展的想法\DateTime


44
{{ game.gameDate|date('Y-m-d H:i:s') }}日期和时间。我在几分钟内找不到角色。
Murko 2013年

6
Twig的date函数使用与php函数相同的格式(来自Twig文档)。对于任何寻求其他格式的人,请php.net/manual/en/function.date.php
JonnyS 2014年

9
注意空值;在类似的用例中,将空值传递给Twig date函数时,我看到的是今天的日期。根据您的示例,您需要将其包装起来{% if game.gameDate is not empty %} ... {%endif}
fazy

4
至于本地化,您不应该扩展DateTime课程!相反,只需localizeddate对Twig 使用过滤器
Nic Wortel 2014年

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}将被建议
Dheeraj

90

您可以使用date过滤器:

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

3
完全同意你的看法。默认情况下应该存在。
tftd 2012年

2
@ThomasDecaux实际上一点也不奇怪,因为__toString()方法需要知道将DateTime对象转换为哪种格式,并且那里可能有数百种可能的格式。当然,在PHP中,您可以format()在带有DateTime格式参数的对象上使用方法,而date过滤器只是该方法的Twig等效项。
Nic Wortel

68

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

静态日期格式

如果要显示静态格式(对于所有语言环境都相同)(例如,Atom提要使用ISO 8601),则应使用Twig的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_formattime_format您可以使用以下字符串之一:

  • 'none' 如果您不想包含此元素
  • 'short' 最简短的样式(在英语语言环境中为12/13/52或3:30 pm)
  • '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') }}

但是,如果您使用其他语言环境,则结果将针对该语言环境进行本地化:

  • 6 februari 2014 10:52对于nl语言环境;
  • 6 février 2014 10:52对于fr语言环境;
  • 6. Februar 2014 10:52对于de语言环境;等等

如您所见,localizeddate不仅翻译月份名称,而且使用本地符号。英文符号将日期放在月份之后,而荷兰语,法语和德语符号则将日期放在月份之前。英文和德文的月份名称以大写字母开头,而荷兰文和法文的月份名称为小写字母。德国日期后面加了一个圆点。

安装/设置语言环境

有关Intl扩展的安装说明,请参见此单独的答案


1
本地化的日期(和时间)-非常感谢您提供@Nic-太棒了!
webDEVILopers 2014年

嗨,使用localizeddate,您知道如何仅输出M和Y(而不是日期)吗?thks
mario

3

不要忘记

@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


2

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




1

我知道这是一个很老的问题,但是我今天找到了这个问题,但是答案并不是我所需要的。

所以这就是我所需要的。

如果您像我一样希望在树枝中显示当前日期,则可以使用以下方法:

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

请参阅有关此文档:

日期在树枝上


0

为了避免在空值上出错,可以使用以下代码:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.