已开启
fix(cloud): 时区感知的日期边界 + 每日目标可配置 (#3, #4) #3
fix(cloud): 时区感知的日期边界 + 每日目标可配置 (#3, #4) #3
已开启
雅皮士创建于 9 天前
雅皮士
雅皮士
9 天前

变更说明

本 PR 一并处理 Issue #3 的时区问题与 Issue #4 的 dailyGoal 硬编码(同属云侧「时间/配置一致性」,且改动集中在同一批文件,合并为一个聚焦 PR 以避免互相冲突)。

1)时区修正(Refs #3)

原实现用 UTC 日期界定「今日」:

const today = new Date().toISOString().split('T')[0]; // UTC

对 UTC+8 用户,00:00–08:00 的学习记录会被算到前一天,导致 todayLearned / streak 错乱。

现改为按时区计算本地日边界:

  • 新增 resolveTzOffset() / tzDayStr() / tzDayStartIso() 辅助函数;
  • 默认 UTC+8(480 分钟),可通过请求 body.tzOffset 覆盖(任意 -720~840 分钟);
  • 今日记录查询区间由本地日边界换算为 UTC 时间点:[todayStart, todayStart+24h);
  • learnWord 的「昨天」及 lastCheckinDate 比较也统一基于该时区。

验证:本地日 2026-11-06 → UTC 区间 2026-11-05T16:00:00.000Z ~ 2026-11-06T16:00:00.000Z ✓

2)dailyGoal 配置化(Refs #4)

原 3 个函数各自硬编码 const dailyGoal = 10;。现统一为:

const DAILY_GOAL = parseInt(process.env.DAILY_GOAL || '10', 10);
  • deploy.py 的 COMMON_VARS 增加 DAILY_GOAL,优先读取 .env;
  • .env.example 增加 DAILY_GOAL=10 说明。

涉及文件

  • harmony_cloud/functions/getDailyWords/main.js
  • harmony_cloud/functions/getProgress/main.js
  • harmony_cloud/functions/learnWord/main.js
  • harmony_cloud/deploy/deploy.py
  • harmony_cloud/.env.example

验证

说明

  • 本 PR 只修改「今日」计算与每日目标配置,不改变返回结构与业务分支逻辑。
  • 端侧 HttpUtil.ets 注入 tzOffset 可作为后续增强;当前默认 UTC+8,对目标用户(CET-4 场景)已正确。
  • 与 PR #1 同在 getDailyWords/getProgress,但改动区域不同(#1 改导入行,本 PR 改日期/配置逻辑),建议先合并 #1。

Refs #3, #4

likedislike
合并受阻
雅皮士雅皮士
9 天前 关联了issue:[Bug][P0] getDailyWords / getProgress 云函数使用命名导入,与 node-appwrite v11 不兼容,[Bug][P1] 登录态不持久化 + UTC 时区导致连续打卡数据错乱,[Enhancement][P2] 可维护性与性能优化:dailyGoal 硬编码、查询效率、MVVM 分层、测试缺失