根因: 运行容器默认 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)
This commit is contained in:
@@ -77,6 +77,7 @@ steps:
|
|||||||
docker run -d --name cpdaily-xiaozhushou-new \
|
docker run -d --name cpdaily-xiaozhushou-new \
|
||||||
--restart unless-stopped \
|
--restart unless-stopped \
|
||||||
--network likedream-net \
|
--network likedream-net \
|
||||||
|
-e TZ=Asia/Shanghai \
|
||||||
-p $PORT_STANDBY:8093 \
|
-p $PORT_STANDBY:8093 \
|
||||||
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
||||||
cpdaily-xiaozhushou:$IMAGE_TAG
|
cpdaily-xiaozhushou:$IMAGE_TAG
|
||||||
@@ -126,6 +127,7 @@ steps:
|
|||||||
docker run -d --name cpdaily-xiaozhushou \
|
docker run -d --name cpdaily-xiaozhushou \
|
||||||
--restart unless-stopped \
|
--restart unless-stopped \
|
||||||
--network likedream-net \
|
--network likedream-net \
|
||||||
|
-e TZ=Asia/Shanghai \
|
||||||
-p $PORT_ACTIVE:8093 \
|
-p $PORT_ACTIVE:8093 \
|
||||||
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
||||||
cpdaily-xiaozhushou:$IMAGE_TAG
|
cpdaily-xiaozhushou:$IMAGE_TAG
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ RUN go build -ldflags="-s -w" -o server ./cmd/server/
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
RUN apk add --no-cache ca-certificates tzdata
|
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=backend-builder /build/server /app/server
|
||||||
COPY --from=frontend-builder /build/dist /app/dist
|
COPY --from=frontend-builder /build/dist /app/dist
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
@@ -23,6 +23,16 @@ func main() {
|
|||||||
log.Fatalf("加载配置失败: %v", err)
|
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()
|
database.Init()
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,9 @@ func ReportFailedLogin(c *fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 1. 检查该校是否有今天登录过的账号(说明学校可正常使用,忽略本次报告)
|
// 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
|
var todayLoginCount int64
|
||||||
database.DB.Model(&model.SysUser{}).
|
database.DB.Model(&model.SysUser{}).
|
||||||
Where("school_id = ? AND last_login_at >= ?", req.SchoolID, today).
|
Where("school_id = ? AND last_login_at >= ?", req.SchoolID, today).
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "8884:8093"
|
- "8884:8093"
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro
|
- /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
Reference in New Issue
Block a user