我将所有日期都以 UTC 形式存储在数据库中。但我想在用户时区显示它们。
$mydate = new \DateTime('2024-08-07 12:00:00');
使用像
{{ mydate|date('d.m.Y H:i:s', 'Europe/Berlin') }}
这样的日期过滤器在Twig中显示日期可以按预期工作并显示07.08.2024 14:00:00
但是当我将翻译功能与 ICU 消息格式结合使用时,我不知道如何设置显示日期所需的时区。
我正在使用 ICU 消息格式,如 https://symfony.com/doc/current/reference/formats/message_format.html#date-and-time 中所述。以下是我的应用程序的示例消息。
my_message: the date and time is {mydate, date} {mydate, time, full}
<div>{{ my_message|trans({mydate: mydate}) }}</div>
<!-- my locale is DE -->
<div>07.08.2024 12:00:00 Koordinierte Weltzeit Uhr</div>
如果我设置
date_default_timezone_set('Europe/Berlin')
,翻译的输出与以前相同。但是因为我告诉 PHP 我的所有日期都应该有一个默认时区 Europe/Berlin
,所以树枝过滤器显示也显示相同的数据。因为它将 Europe/Berlin
转换为 Europe/Berlin
,因此显示 12:00:00
而不是 14:00:00
。
对于 PHP 的
DateTime
,时区是 DateTime
对象本身的属性。 因此,您应该在创建 $mydate
变量时设置时区,然后在 before 渲染它以与 ICU 消息一起显示。 换句话说,时区不是显示格式的一部分,而是底层数据的一部分。
既然您说您的数据采用UTC格式,那么您可以在加载数据后从UTC转换为所需的时区。 这里有一些关于如何做到这一点的示例。