每日额度在 00:00 重置,国内用户发现早上 7 点 59 分还是今日额度已用完,8 点整才恢复。客服记录里 6 月有 47 个用户反馈这个时间段用不了。乍看像缓存或者权限的锅,追下去往往不是。

SELECT NOW(), CONVERT_TZ(NOW(), 'UTC', 'Asia/Shanghai');
SELECT user_id, reset_at FROM quota WHERE user_id = 3312;
# reset_at 应是北京时间零点

追下去是这么回事:重置任务用的是 UTC 时间,服务器和数据库都按 UTC 存,业务上说的今天按北京时间算。两边差 8 小时,重置点实际落在早高峰。

「配额重置时区」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,重置时间统一按业务时区 用 Asia/Shanghai 计算零点;库里的时间字段统一存 UTC 展示再转 不要混用;有海外用户就按租户时区分别触发。

验收就看一点,第二天 00:05 查额度已经重置,早上 8 点前后的用量曲线不再有断点。

作者 9823189