refactor(时区): 常量收进契约、SQL 统一走 localTime,去掉会话时区与 TZ 兜底
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
- TIME_ZONE / TIME_ZONE_OFFSET_MINUTES 移到 packages/contract/src/time.ts,
前后端共用一份,不再各写一遍靠注释对齐。
- apps/api/src/time.ts 新增 localTime(列),替换散落 7 处的
`at time zone ${TIME_ZONE_SQL}`;ac-trend 的 where 复用同一个 year 表达式。
- /problems/:displayId/yearly-ac 漏写了时区、按 UTC 切年,被会话时区兜底掩盖;
改为按东八区切(只影响每年 12-31 北京 0–8 点的提交归年)。
- 删掉数据库连接的 TimeZone 和 Dockerfile 的 TZ:正确代码不依赖它们,
它们只会在线上掩盖漏写处、让 dev 与线上答案不同。
- time.ts:calendarDayYearsAgo/pad 并入 shiftMonthsByCalendar,startOfCalendarDay
并入 todayStart,localWeekday 改用 getUTCDay,删掉历史叙述注释。
- 前端 zonedParts 改为固定偏移 + getUTC*(与后端、日期选择器同一写法),
去掉 Intl formatToParts;10 万次 299ms → 11ms。zonedYear 去掉按浏览器时区的兜底。
- 两份 CLAUDE.md 同步;n-date-picker 那条过时说明改成现用法。
验证:新旧「近两年起点」21359 个时刻 0 差异、localWeekday 0 差异、
前端固定偏移与 Intl 在 America/New_York 下 47821 个时刻 0 差异;
localTime 在 select/group by/where 复用可用;fix-achievement-hours 预演仍为 148 / 60。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1d8B3f4SXJwDvUY625eQd
This commit is contained in:
@@ -160,18 +160,7 @@ COPY apps/api/src/db/meta/_journal.json /usr/local/share/oj2/migrations/meta/
|
||||
# 这不是审美问题:切换那天不用搬动任何文件,回滚时旧后端也立刻能找到自己的数据。
|
||||
# 少一次几十 GB 的 mv,就少一个在停机窗口里出错的机会。
|
||||
WORKDIR /data
|
||||
# TZ 是**兜底**,不是时区口径的依据 —— 业务时区的唯一锚点在 apps/api/src/time.ts。
|
||||
# 设它是为了任何一处还在用 `getHours()` / `setHours(0,0,0,0)` 这类跟进程时区走的代码
|
||||
# 也落在北京时间上(旧 Django 栈的 `settings.TIME_ZONE` 就是这个作用)。
|
||||
#
|
||||
# **必须同时设 worker 容器**:worker 跑的是同一个镜像、同样的 ENV,所以这一行两边都覆盖。
|
||||
# 本机 `bun run dev` 走不到这里,进程时区是开发机的 —— 这也是为什么 time.ts 用固定
|
||||
# 偏移而不是依赖进程 TZ:dev 和线上必须算得一样。
|
||||
#
|
||||
# debian:trixie-slim 自带 tzdata(实测 /usr/share/zoneinfo/Asia/Shanghai 存在),
|
||||
# 不用额外 apt 装。哪天换基底要重新确认这一条,否则 TZ 会被静默忽略、回落成 UTC。
|
||||
ENV TZ=Asia/Shanghai \
|
||||
TEST_CASE_DIRECTORY=/data/test_case \
|
||||
ENV TEST_CASE_DIRECTORY=/data/test_case \
|
||||
HITOKOTO_DIRECTORY=/data/hitokoto \
|
||||
UPLOAD_DIRECTORY=/data/public/upload \
|
||||
AVATAR_DIRECTORY=/data/public/avatar \
|
||||
|
||||
Reference in New Issue
Block a user