一个困扰我半天的时区问题
有个每天定时跑的小任务,本地测试一切正常,放到机器上就变成了早上四点触发——比预期早了八小时。
第一反应是 cron 写错了,检查完没问题。第二反应是系统时间不对,date 一看也是对的。最后才发现是容器里的时区是 UTC,而代码里用 toISOString() 取了「今天」,再拿这个日期去查数据。
问题在于:任务本身按本地时间触发,但查数据时用的却是 UTC 日期。两点之间隔了八小时,跨日的时候就对不上了。
教训其实很老套:
- 存储一律用 UTC,别存本地时间;
- 只在展示层做转换,而且转换的时区要显式写出来,不要依赖运行环境;
- 「今天」这种概念要跟着用户所在的时区走,而不是跟着机器。
改完之后顺手给容器加了 TZ 环境变量,日志时间也和本地对得上了。不过说到底,日志时间和业务逻辑没关系,真正要改的还是那几处隐式依赖本地时区的代码。