Magento 2后台订单网格日期筛选未按店铺时区生效问题咨询
解决Magento 2.2.7后台订单筛选时区不匹配问题
首先明确:Magento 2.2.7默认后台并没有内置配置可以直接让订单采购日期筛选使用店铺时区(印度标准时间+05:30),它确实是按照数据库存储的UTC时间来做筛选的——这也是你遇到00:01-05:30时段订单无法被筛选到的核心原因:这些订单在数据库里的UTC时间其实是前一天的18:31-23:59,按当天店铺时区筛选时自然会被漏掉。
下面是两种可行的解决思路:
1. 自定义模块修改筛选逻辑(推荐,从根源解决)
这个方法可以让后台筛选时自动适配店铺时区,不需要手动换算:
- 创建一个自定义模块,重写订单网格的日期筛选逻辑
- 针对
sales_order_grid集合的日期筛选条件,添加时区转换:把你选择的店铺时区日期范围,转换成对应的UTC时间范围后再传递给数据库查询 - 具体可以通过插件(Plugin)或者重写
Magento\Sales\Model\ResourceModel\Order\Grid\Collection类的addFieldToFilter方法,当筛选字段是created_at时,对传入的日期值做时区转换处理
示例代码片段(需适配你的模块结构):
public function addFieldToFilter($field, $condition = null) { if ($field === 'created_at' && is_array($condition)) { $timezone = $this->_localeDate->getTimezone(); foreach ($condition as $operator => $value) { $date = $this->_localeDate->date($value, null, false); $utcDate = $date->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s'); $condition[$operator] = $utcDate; } } return parent::addFieldToFilter($field, $condition); }
注意:这个方法需要你有基础的Magento模块开发能力,修改完成后记得清除缓存并多测试几个时段的筛选结果。
2. 临时变通方案(无需开发,快速适配)
如果暂时不想做开发,可以用手动换算的方式规避问题:
- 当你需要筛选某一天的印度时区订单时,把后台的UTC日期范围调整为前一天的18:31到当天的18:30
- 比如要筛选印度时间2024-05-20的订单,就在后台设置UTC时间范围为2024-05-19 18:31 至 2024-05-20 18:30,这样就能包含所有印度时间当天00:01到23:59的订单
额外提示
Magento 2.3及以上版本在后台订单筛选的时区适配上有原生优化,如果你后续考虑升级版本,这个问题大概率会被自动解决。
内容的提问来源于stack exchange,提问作者Bikash Kaushik
相关产品推荐
相关产品推荐

