具体表现

数据库存的秒级时间戳,转成日期后比实际时间早八小时,导出报表的日期边界全错。

先判断哪一层出错

时间戳本身是 UTC 基准,fromtimestamp 按本地时区解释,utcfromtimestamp 保持 UTC,混用就出现偏移。判断时先分清是 Python 时间戳时区 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

操作步骤

  1. 确认服务器时区设置
  2. 统一用带时区的 datetime
  3. 输出前显式转换到目标时区

对应的命令或配置片段如下,可直接复制:

from datetime import datetime, timezone, timedelta
ts = 1730000000
tz = timezone(timedelta(hours=8))
print(datetime.fromtimestamp(ts, tz).strftime('%Y-%m-%d %H:%M:%S'))

如果同一现象隔一段时间又出现,多半是某个定时任务或重启流程把配置覆盖回去了,顺手查一遍启动脚本。测试环境复现不了时,先对比两边的版本号和配置文件,差异往往就在被忽略的那几行里。

收尾检查

转换结果与业务后台显示的时间完全一致,跨天边界的数据归属正确。

作者 9823189