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

Chr*_*ann 209 php datetime symfony twig

我的一个实体中的一个字段是"日期时间"变量.

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

这是一段代码:

{% for game in games %}
    ...
        <td> {{game.gameTeamIdOne.teamName}} </td>
        <td> {{game.gameTeamIdTwo.teamName}} </td>
        <td> {{game.gameDate}}</td>
    </tr>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这是我的实体类中的变量:

/**
 * @var date $gameDate
 *
 * @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
 */
private $gameDate;
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误消息:

在渲染模板期间抛出异常("Catchable Fatal Error:类DateTime的对象无法转换为...\app\cache\dev\twig\9b\ad\58fd3bb1517632badf1fdc7fa4a8.php第33行中的字符串" )在第10行的"BeerBundle:Games:gameTable.html.twig"中.

Ger*_*kai 297

虽然你可以使用

{{ game.gameDate|date('Y-m-d') }}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

正如@Nic在评论中所指出的,如果你使用TwigIntl扩展,你将有一个localizeddate可用的过滤器,它在用户的语言环境中显示日期.通过这种方式,您可以放弃我之前的扩展想法\DateTime.

  • `{{game.gameDate | date('Ymd H:i:s')}}`用于日期和时间.几分钟我找到角色的问题. (43认同)
  • 注意空值; 在一个类似的用例中,我看到今天的日期,将空值传递给Twig的`date`函数.根据你的例子,你需要将它包装在`{%if game.gameDate不为空%}} ... {%endif} (9认同)
  • Twig的日期函数使用与php函数相同的格式(来自Twig文档).对于寻找其他格式的人,请访问http://www.php.net/manual/en/function.date.php. (5认同)
  • 至于本地化,你不应该扩展`DateTime`类!相反,[只需使用Twig的`localizeddate`过滤器](http://stackoverflow.com/a/23424315/1001110). (4认同)

Ond*_*ták 89

你可以使用date过滤器:

{{ game.gameDate|date("m/d/Y") }}
Run Code Online (Sandbox Code Playgroud)

  • 完全同意你的看法.这是默认应该存在的东西. (3认同)
  • @ThomasDecaux实际上并不是那么奇怪,因为`__toString()`方法需要知道将`DateTime`对象转换为哪种格式,并且可能存在数百种可能的格式.当然,在PHP中,您可以在`DateTime`对象上使用[`format()`](https://php.net/manual/en/datetime.format.php)方法,该对象采用格式参数,并且`date`过滤器就是该方法的Twig等价物. (2认同)

Nic*_*tel 67

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

静态日期格式

如果要显示静态格式(对于所有语言环境都是相同的(例如Atom提要的ISO 8601),则应使用Twig的date过滤器:

{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}
Run Code Online (Sandbox Code Playgroud)

哪个将以下列格式返回日期时间:

2014-05-02T08:55:41Z

date过滤器接受的格式字符串与您用于PHP date()函数的格式字符串相同.(唯一的区别是,据我所知,你不能使用可以在PHP date()函数中使用的预定义常量)

本地化日期(和时间)

但是,由于您希望在浏览器中呈现它,您可能希望以人类可读的格式显示它,并根据用户的语言和位置进行本地化.您可以使用Intl扩展(使用PHP的IntlDateFormatter)而不是自己进行本地化.它提供了一个过滤器localizeddate,它将使用本地化格式输出日期和时间.

localizeddate( date_format, time_format [, locale ] )
Run Code Online (Sandbox Code Playgroud)

参数localizeddate:

  • date_format:格式字符串之一(见下文)
  • time_format:格式字符串之一(见下文)
  • locale:(可选)使用此选项覆盖已配置的区域设置.保留此参数以使用默认语言环境,可以在Symfony的配置中进行配置.

(还有更多,请参阅文档以获取可能参数的完整列表)

对于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') }}
Run Code Online (Sandbox Code Playgroud)

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

  • 6 februari 2014 10:52对于nl现场;
  • 6 février 2014 10:52对于fr现场;
  • 6. Februar 2014 10:52对于de现场; 等等

如您所见,localizeddate不仅会翻译月份名称,还会使用本地符号.英语符号表示月份之后的日期,荷兰语,法语和德语符号在月份之前放置.英语和德语月份名称以大写字母开头,而荷兰语和法语月份名称以小写字母开头.德国日期附加一个点.

安装/设置区域设置

Intl扩展的安装说明可以在这个单独的答案中找到.


Arn*_*mon 7

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

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Run Code Online (Sandbox Code Playgroud)


Ref*_*lon 5

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

所以这就是我需要的。

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

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

请参阅有关此的文档:

树枝上的约会