You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Drupal 8暴露日期筛选器大于/小于/等于功能异常问题

解决Drupal 8视图暴露日期筛选器的时区转换问题

这个坑我之前踩过!你遇到的问题本质是Drupal处理日期时的时区转换逻辑和视图筛选器的日期截断规则在搞鬼,不是筛选器不识别“等于”,而是输入的日期被悄悄转成了前一天的UTC时间,导致查询范围没覆盖到你的文章。

问题根源拆解

  1. 时区转换差异:Drupal默认会把用户输入的“纯日期”(比如28-02-2018)解析为站点时区当天的00:00:00,然后转换成UTC时间用于数据库查询。如果你的站点时区是GMT+1(或其他比UTC早的时区),那28-02-2018 00:00:00转成UTC就是27-02-2018 23:00:00。
    • 你的文章结束日期是站点时区的28-02-2018 10:00:00,转成UTC是28-02-2018 09:00:00。
    • 此时你的<= 结束日期筛选条件就变成了<= 2018-02-27 23:00:00 UTC,显然你的文章结束日期不在这个范围内,所以查询为空。
  2. 视图筛选器的日期类型设置:如果筛选器的“日期类型”选了“日期”而非“日期和时间”,Drupal会直接截断时间部分,只比较日期字符串,但时区转换的问题依然存在,导致实际查询的日期范围偏移。

具体解决方案

方案1:调整视图筛选器的基础设置(无代码)

这是最简单的解决方式,不需要写代码:

  • 打开你的视图编辑页面,找到两个暴露筛选器(>= 开始日期<= 结束日期
  • 点击每个筛选器的“设置”按钮,找到**“日期类型”**选项,选择日期和时间(不要选“日期”)
  • 保存视图后,再测试筛选:如果用户输入纯日期,Drupal会自动把<= 结束日期的时间补为23:59:59(站点时区),转成UTC后就会覆盖当天的所有时间范围,你的文章就能被匹配到。

方案2:用自定义代码强制修正日期范围(适合高级需求)

如果方案1的效果不符合你的预期,比如不想让用户看到时间输入框,可以通过自定义模块的hook_views_query_alter()来手动调整查询的日期范围:

/**
 * Implements hook_views_query_alter().
 */
function your_custom_module_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
  // 替换成你实际的视图ID和显示ID
  if ($view->id() == 'event_list' && $view->current_display == 'page_1') {
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // 处理开始日期的>=筛选
        if (strpos($condition['field'], 'field_event_start') !== FALSE && $condition['operator'] == '>=') {
          $date = new DrupalDateTime($condition['value']['value']);
          $date->setTime(0, 0, 0); // 设置为当天0点
          $condition['value']['value'] = $date->format('Y-m-d\TH:i:s');
        }
        // 处理结束日期的<=筛选
        if (strpos($condition['field'], 'field_event_end') !== FALSE && $condition['operator'] == '<=') {
          $date = new DrupalDateTime($condition['value']['value']);
          $date->setTime(23, 59, 59); // 设置为当天23:59:59
          $condition['value']['value'] = $date->format('Y-m-d\TH:i:s');
        }
      }
    }
  }
}

记得把代码中的your_custom_moduleevent_listpage_1field_event_startfield_event_end替换成你自己的模块名、视图ID、显示ID和字段名。

方案3:检查站点时区设置

最后别忘了确认你的站点时区是否正确:

  • 进入/admin/config/regional/settings
  • 确保“默认时区”设置和你预期的一致(比如如果你的文章日期是北京时间,就选“Asia/Shanghai”)
  • 时区设置错误会导致所有日期转换都出现偏移,这也是很多人忽略的关键点。

为什么你之前参考的issue没解决问题?

那个issue里的评论可能只处理了单一方向的日期调整(比如只修正了开始日期),或者没有同步调整时区设置和筛选器的日期类型,所以没能彻底解决你的问题。

内容的提问来源于stack exchange,提问作者Joost

火山引擎 最新活动