邮件里写的发货时间是 02:30,订单详情页显示 10:30,客户以为发错了货,客服一天要解释七八次。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,邮件服务跑在 UTC 时区的容器里,格式化时没做时区转换,订单页由前端按本地时区渲染,两边差了八小时。夏令时地区还会再偏一小时。
「邮件模板时区」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。报错里带路径的,先去看那个路径在不在、权限对不对。
from zoneinfo import ZoneInfo
local = dt.astimezone(ZoneInfo('Asia/Shanghai'))
label = local.strftime('%Y-%m-%d %H:%M') + ' (GMT+8)'
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,数据库统一存 UTC,展示前按用户所在时区转换,邮件和页面用同一个格式化函数;邮件里把时区后缀写出来,避免收件人自己换算;用一笔跨零点的订单对比邮件和页面时间。
最后用这个标准收尾,邮件和订单页显示同一时刻,后面带 GMT+8 标识。
