筛选“1月10日到1月10日”少了当天早上的订单,而数据库记录明明存在。把 MySQL 时区改成本地只会让核心表和扩展表更加混乱。
画出同一时间的三种表示
- 数据库字段:通常为 UTC;
- 筛选输入:管理员看到的本地日期;
- SQL 边界:转换后的 UTC 起止时间。
SELECT @@global.time_zone, @@session.time_zone, UTC_TIMESTAMP(), NOW();自定义 UI Component 列若同时设置 date filter,又在 collection 的 addFieldToFilter 中手工减 8 小时,就会重复转换。结束日期还应覆盖本地当天的完整范围,而不是当天 00:00:00。
| 测试 | 必须命中 |
|---|---|
| 当天00:00本地时间 | 第一条边界记录 |
| 当天23:59:59 | 最后一条边界记录 |
| 夏令时切换日 | 按实际时区偏移换算 |

