按天做 date_histogram,东八区凌晨的订单全被算到前一天,报表每天少 800 单。文档里存的时间看着是对的,单条查询也对。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,date 字段内部按 UTC 存,聚合默认也按 UTC 切桶。写入时带的是 +08:00,展示时又转回本地,中间的桶边界没指定时区。差八小时刚好把零点到八点的数据挤到前一天。

碰到「date 时区聚合」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。改完顺手把文档补一句,省得下次自己重新推一遍。

GET orders/_search
{"size": 0, "aggs": {"d": {"date_histogram":
{"field": "create_time", "calendar_interval": "day", "time_zone": "Asia/Shanghai"}}}}

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,聚合里显式指定 time_zone 为 Asia/Shanghai;写入统一用带偏移的 ISO 格式 别写不带时区的字符串;Kibana 的展示时区和索引时区分开确认;改完对一遍某一天的订单数和数据库 count。

最后用这个标准收尾,某一天的桶计数和数据库按本地日期统计的结果完全一致。

作者 9823189