如何在没有时区干扰的情况下在树枝中渲染时间

Posted

技术标签:

【中文标题】如何在没有时区干扰的情况下在树枝中渲染时间【英文标题】:How do I render time in twig without time zone interference 【发布时间】:2019-04-07 04:34:12 【问题描述】:

我只想从 Drupal 日期字段中获取时间,并将其呈现在与日期分开的树枝模板中。

在我的活动 Twig 模板中,我目前以 3 种方式列出了日期:

 content 

显示所有字段。 时间(来自日期字段)正确显示为; 28/04/2019 - 1:11 这是创建内容时输入的正确时间。 在同一页面上,使用时:

 content.field_date_start 

28/04/2019 - 1:11 也显示更正。 但我想抓住时间只与日期分开显示 所以我把它放在树枝上:

 node.field_date_start.value|date("g:ia") 

显示为: 凌晨 3 点 11 分

这是不正确的,延迟 14 小时(输入时的 1.11 是下午 1.11)

如何将时间分隔到树枝内的单独显示中,同时根据输入的方式保留正确的时间。

如何将它输入到树枝中?

如果人们在不同时区输入内容或查看内容,我不希望时间改变。 示例 - 有人在澳大利亚墨尔本创建内容,而其他人在英国伦敦查看内容 - 无论如何时间都应该显示。

【问题讨论】:

【参考方案1】:

Drupal 根据 UTC 时区将日期保存在数据库中。例如,如果您以在配置文件中选择了伦敦 (UTC + 1) 时区的用户的身份输入 09:00 AM 作为时间,则在数据库中将其保存为 08:00 AM。如果站点的时区设置为伦敦 (UTC +1),情况也是如此。

我建议对字段进行预处理并为开始时间设置一个变量。

function HOOK_preprocess_node(&$variables) 
  $node = $variables['elements']['#node'];
  $timezone = drupal_get_user_timezone();
  $formatter = \Drupal::service('date.formatter');
  $field_date_start = $node->get('field_date_start')->getValue()->getTimestamp();
  $time = $formatter->format($field_date_start, 'custom', 'g:ia', $timezone);
  $variables['start_time'] = $time;

然后将模板中的值打印为

 start_time 

【讨论】:

嗨 Ajit S,我使用了你的钩子和树枝代码。但没有显示时间。作为测试,我将函数 HOOK_preprocess_node_event(&$variables) 更改为: function HOOK_preprocess_node_events(&$variables) (因为我的内容类型称为“事件”)。但这也不起作用。每次我在 CLI 中使用“drush cr”并在 Drupal / Performance 中清除缓存以确保页面正在更新。但没有出现日期。我还可以确认我的树枝正在为页面设置样式,因为我已将其他测试内容放置在正确显示的树枝中。知道是什么阻止了它的工作吗? @AuxiliaryJoel 为输入错误的函数道歉。它应该只是HOOK_preprocess_node(&$variables)。此外,将函数名称中的 HOOK 替换为您正在编写此函数的模块或主题名称。

以上是关于如何在没有时区干扰的情况下在树枝中渲染时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有要映射的对象数组的情况下在 React.js 中循环和渲染元素?

如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?

没有四舍五入小数的树枝数字格式

在不使用字符串的情况下在 javascript 中获取另一个时区的时区偏移量

如何在没有 AJAX 的情况下在 Rails 客户端过滤数据

如何在Symfony2中将json渲染成树枝