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

241

我的一个实体中的一个字段是一个“日期时间”变量。

如何将此字段转换为字符串以在浏览器中呈现?

这是一个代码片段:

{% 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;

以下是我收到的错误信息:

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

12个回答

331
尽管您可以使用
{{ game.gameDate|date('Y-m-d') }}

请注意,这个版本不支持用户区域设置,对于只有一个民族使用的网站来说这不应该是一个问题。国际用户应该完全以不同的方式显示游戏日期,比如扩展 \DateTime 类,并添加一个 __toString() 方法,在其中检查区域设置并相应地进行操作。

编辑

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


56
日期和时间为 {{ game.gameDate|date('Y-m-d H:i:s') }}。我在寻找“分钟”的字符时遇到了问题。 - murko
6
Twig 的日期函数使用与 PHP 函数相同的格式(来自 Twig 文档)。如果有人在寻找其他格式,请查看 http://www.php.net/manual/en/function.date.php。 - JonnyS
9
注意空值;在类似的用例中,当将空值传递给Twig的 date 函数时,我发现今天的日期。根据你的示例,你需要用 {% if game.gameDate is not empty %} ... {%endif} 包裹它。 - fazy
4
关于本地化,不应该扩展DateTime类!相反,只需在Twig中使用localizeddate过滤器即可。 - Nic Wortel
请注意确保您的日期正确,否则它会抛出异常。 - COil
1
建议使用 {% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %} - some_groceries

92
你可以使用date 过滤器:
{{ game.gameDate|date("m/d/Y") }}

3
非常同意您的观点。这是默认情况下应该存在的内容。 - tftd
2
@ThomasDecaux,这其实一点也不奇怪,因为__toString()方法需要知道将DateTime对象转换成哪种格式,而可能有数百种可能的格式。当然,在PHP中,您可以在DateTime对象上使用format()方法,该方法接受一个格式参数,而date过滤器只是Twig相当于该方法的等效形式。 - Nic Wortel

76
这取决于您想要显示日期的格式。
静态日期格式
如果您想显示一个静态格式,对于所有语言环境都相同(例如Atom feed中的ISO 8601),您应该使用Twig的date filter
{{ 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' 用于中等式样(在英语区域设置中为Jan 12, 1952)
  • 'long' 用于长式样(在英语区域设置中为January 12, 1952或3:30:32 pm)
  • 'full' 用于完全指定的式样(在英语区域设置中为Tuesday, April 12, 1952 AD或3:30:42 pm PST)

示例

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

{{ game.gameDate|localizeddate('long', 'short') }}

然而,如果您使用不同的语言环境,则结果将针对该语言环境进行本地化:
  • 对于nl语言环境,日期格式为6 februari 2014 10:52
  • 对于fr语言环境,日期格式为6 février 2014 10:52
  • 对于de语言环境,日期格式为6. Februar 2014 10:52等。
正如您所看到的,localizeddate不仅翻译月份名称,还使用本地符号。英文符号将日期放在月份之后,而荷兰语、法语和德语符号将其放在月份之前。英文和德文月份名称以大写字母开头,而荷兰和法国的月份名称则是小写字母。而德国的日期则附加了一个点。

安装/设置语言环境

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


1
本地化日期(和时间)- 非常感谢@Nic - 太棒了! - webDEVILopers
嗨,使用localizeddate,您知道如何仅输出M和Y(不是day)吗?谢谢。 - mario
如果您正在填写类型为“datetime-local”的输入框,请使用Y-m-d\TH:i来正确地在TWIG中呈现。 - Robert Saylor

8

我知道这是一个比较老的问题,但今天我发现了这个问题,但回答并不是我所需要的。

所以这就是我需要的。

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

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

了解有关此内容的文档:

twig中的日期


1
这正是我在寻找的。谢谢! - Nathanael

7
为了避免空值错误,您可以使用以下代码:
{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}

4

不要忘记

@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


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

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


2

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


2
您可以使用Twig的日期函数和三元运算符。
{{ game.gameDate ? game.gameDate|date('d-m-Y H:i') : 'Not Available' }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接