refactor(time): 不再全局改写 time.Local,业务时间统一走显式时区
main.go 原本在启动时执行 time.Local = timeutil.Location(),靠隐式改写进程全局 状态把时间钉在 +08:00。副作用是任何跑在这行之前的代码都处于另一个时区,且依赖 关系完全不可见。 - 移除该全局赋值,业务时间全部走 timeutil 的显式时区 - rock_snapshot.parseRockTime 是唯一真实依赖,且是会出事的那一处:上游返回不带 偏移的北京时间墙面时间,用 time.Local 解析会在 TZ≠+08:00 时整体偏移 8 小时, 把「本次新绑定」误判为「历史残留」而放回库存,直接造成重复发货。 改为 timeutil.Location() 并补回归测试 - 有一点无法绕开:pgx 会把 timestamptz 解码到 time.Local,所以接口 JSON 的时间 偏移仍由进程时区决定。新增 timeutil.LocalZoneNotice(),启动时把不一致显式告警, 交由运维用 TZ=Asia/Shanghai 声明(Docker 部署已内置),而不是靠代码偷偷改全局 - 测试时间基线改用业务时区,避免随宿主机 TZ 漂移 验证:全量测试在默认时区、TZ=UTC、TZ=America/New_York 三种环境下均通过; 实测 TZ=UTC 启动打印时区提示,业务时区下静默。
This commit is contained in:
@@ -36,7 +36,6 @@ func secondsToDurations(seconds []int) []time.Duration {
|
||||
|
||||
func main() {
|
||||
cfg := config.Load()
|
||||
time.Local = timeutil.Location()
|
||||
|
||||
// 日志:控制台 + 文件
|
||||
applog.SetRetainDays(cfg.LogRetainDays)
|
||||
@@ -49,6 +48,13 @@ func main() {
|
||||
defer logFile.Close()
|
||||
}
|
||||
|
||||
// 这里刻意不再改写 time.Local 全局变量。业务时间统一走 timeutil 的显式时区;
|
||||
// 唯一无法绕开的是 pgx 会把 timestamptz 解码到 time.Local,因此把进程时区的
|
||||
// 不一致显式暴露出来,交由运维通过 TZ 声明。
|
||||
if notice := timeutil.LocalZoneNotice(); notice != "" {
|
||||
applog.Warnf("[CONFIG] 时区提示: %s", notice)
|
||||
}
|
||||
|
||||
gin.SetMode(cfg.Mode)
|
||||
|
||||
// 密钥配置体检:让「示例密钥被带到真实部署」这类问题在启动日志里立刻可见。
|
||||
|
||||
Reference in New Issue
Block a user