筛选“1月10日到1月10日”少了当天早上的订单,而数据库记录明明存在。把 MySQL 时区改成本地只会让核心表和扩展表更加混乱。

画出同一时间的三种表示

  1. 数据库字段:通常为 UTC;
  2. 筛选输入:管理员看到的本地日期;
  3. 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最后一条边界记录
夏令时切换日按实际时区偏移换算