From 4a80382b60c5dc93dba5520ea22e874028aed1fe Mon Sep 17 00:00:00 2001 From: becomer Date: Thu, 3 Sep 2026 21:06:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=A8=E5=B1=80=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=8C=97=E4=BA=AC=E6=97=B6=E9=97=B4(Asia/Sha?= =?UTF-8?q?nghai),=20=E4=BF=AE=E5=A4=8D=E8=AE=B0=E5=BD=95=E4=B8=8E?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=81=8F=E7=A7=BB8=E5=B0=8F=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: 运行容器默认 UTC 且后端未设时区, time.Now()/gorm 时间戳/DSN loc=Local/手动 Format 全部按 UTC, 导致展示为"美国时间"、月度与每日 边界错位。修复: - main.go 在 database.Init 前固定 time.Local=Asia/Shanghai (DSN loc=Local 随之一致, 一处生效覆盖全部业务点) - pending_school.go 今日判断改北京时间当日0点(原 Truncate 按UTC午夜偏移8h) - Dockerfile/build.yml/compose 加 TZ=Asia/Shanghai 双保险 配套: 存量 datetime 列已 +8h 迁移(备份 /root/cpdaily-backup-pre-tz-*.sql) --- .woodpecker/build.yml | 2 ++ Dockerfile | 2 ++ backed/cmd/server/main.go | 10 ++++++++++ backed/internal/handler/pending_school.go | 4 +++- deploy/docker-compose.yml | 2 ++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.woodpecker/build.yml b/.woodpecker/build.yml index 264c7c3..9f0b86e 100644 --- a/.woodpecker/build.yml +++ b/.woodpecker/build.yml @@ -77,6 +77,7 @@ steps: docker run -d --name cpdaily-xiaozhushou-new \ --restart unless-stopped \ --network likedream-net \ + -e TZ=Asia/Shanghai \ -p $PORT_STANDBY:8093 \ -v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \ cpdaily-xiaozhushou:$IMAGE_TAG @@ -126,6 +127,7 @@ steps: docker run -d --name cpdaily-xiaozhushou \ --restart unless-stopped \ --network likedream-net \ + -e TZ=Asia/Shanghai \ -p $PORT_ACTIVE:8093 \ -v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \ cpdaily-xiaozhushou:$IMAGE_TAG diff --git a/Dockerfile b/Dockerfile index 147f60c..44241ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,6 +24,8 @@ RUN go build -ldflags="-s -w" -o server ./cmd/server/ # ============================================================ FROM alpine:latest RUN apk add --no-cache ca-certificates tzdata +# 时区固定为北京时间(tzdata 已安装;进程层 main.go 另有 time.Local 兜底) +ENV TZ=Asia/Shanghai COPY --from=backend-builder /build/server /app/server COPY --from=frontend-builder /build/dist /app/dist WORKDIR /app diff --git a/backed/cmd/server/main.go b/backed/cmd/server/main.go index 3d61d39..b31ff6b 100644 --- a/backed/cmd/server/main.go +++ b/backed/cmd/server/main.go @@ -23,6 +23,16 @@ func main() { log.Fatalf("加载配置失败: %v", err) } + // 全局时区固定为中国标准时间(必须在 database.Init 之前设置: + // DSN 的 loc=Local 跟随 time.Local,影响数据库 datetime 读写序列化)。 + // 运行镜像若不设 TZ 默认 UTC,会让所有记录/查询/统计/输出偏移 8 小时 + // (前端展示为"美国时间"),每月 1 日与每日 0-8 点的边界计算也会错位。 + loc, err := time.LoadLocation("Asia/Shanghai") + if err != nil { + log.Fatalf("加载时区 Asia/Shanghai 失败: %v", err) + } + time.Local = loc + // 连接数据库 database.Init() diff --git a/backed/internal/handler/pending_school.go b/backed/internal/handler/pending_school.go index 7501997..81081db 100644 --- a/backed/internal/handler/pending_school.go +++ b/backed/internal/handler/pending_school.go @@ -196,7 +196,9 @@ func ReportFailedLogin(c *fiber.Ctx) error { } // 1. 检查该校是否有今天登录过的账号(说明学校可正常使用,忽略本次报告) - today := time.Now().Truncate(24 * time.Hour) + // 注意:Truncate(24h) 按 UTC 午夜截断会偏移 8 小时,必须按北京时间当日 0 点 + now := time.Now() + today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) var todayLoginCount int64 database.DB.Model(&model.SysUser{}). Where("school_id = ? AND last_login_at >= ?", req.SchoolID, today). diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index e8155d2..16e43af 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -5,6 +5,8 @@ services: restart: unless-stopped ports: - "8884:8093" + environment: + - TZ=Asia/Shanghai volumes: - /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro networks: