修复签到墙日历与列表数量不一致:点选筛选按服务器时区构造区间 #1

Merged
kevin merged 1 commits from dsh/meshtastic_mqtt_server:fix/signed-calendar-timezone into main 2026-08-20 18:17:03 +08:00
Contributor

问题

签到墙(/signed)日历显示的数量与点选某天后列表条数不一致(例如 8/10 日历显示 1 人但列表 2 条、8/15 显示 1 人但列表 0 条)。

根因

  • 后端 /api/signs/daily服务器本地日期DATE_FORMAT(sign_time))分组日历;
  • 但前端点选某天时用浏览器本地时区构造 since/until 区间,后端再按服务器时区解释;
  • 浏览器时区与服务器时区不同(如 UTC+8 vs UTC-4)时,两者相差 12 小时,边界记录错位,导致日历数字与列表条数不一致。

修复

签到页统一按服务器时区工作:

  1. 从接口返回的 sign_time(如 2026-08-15T21:37:59+08:00)动态推导服务器时区偏移;
  2. 点选某天时,用服务器时区构造当天 00:00 ~ 23:59:59.999 的筛选区间(dateRangeForDay);
  3. 日历月份请求同样按服务器时区取当月首日/末日区间(loadCalendar)。

这样任意浏览器时区下,日历分组与点选筛选使用同一时钟,数量必然一致。偏移量动态推导,服务器时区变更(如切换到 Asia/Shanghai)后无需重新部署前端。

验证

  • 8 月全月逐天校验:日历数字 == 点选列表条数,0 处不一致;
  • 已部署到生产环境验证通过(https://mesh.lmve.net/signed)
## 问题 签到墙(/signed)日历显示的数量与点选某天后列表条数不一致(例如 8/10 日历显示 1 人但列表 2 条、8/15 显示 1 人但列表 0 条)。 ## 根因 - 后端 `/api/signs/daily` 按**服务器本地日期**(`DATE_FORMAT(sign_time)`)分组日历; - 但前端点选某天时用**浏览器本地时区**构造 `since/until` 区间,后端再按服务器时区解释; - 浏览器时区与服务器时区不同(如 UTC+8 vs UTC-4)时,两者相差 12 小时,边界记录错位,导致日历数字与列表条数不一致。 ## 修复 签到页统一按服务器时区工作: 1. 从接口返回的 `sign_time`(如 `2026-08-15T21:37:59+08:00`)动态推导服务器时区偏移; 2. 点选某天时,用服务器时区构造当天 `00:00 ~ 23:59:59.999` 的筛选区间(`dateRangeForDay`); 3. 日历月份请求同样按服务器时区取当月首日/末日区间(`loadCalendar`)。 这样任意浏览器时区下,日历分组与点选筛选使用同一时钟,数量必然一致。偏移量动态推导,服务器时区变更(如切换到 Asia/Shanghai)后无需重新部署前端。 ## 验证 - 8 月全月逐天校验:日历数字 == 点选列表条数,0 处不一致; - 已部署到生产环境验证通过(https://mesh.lmve.net/signed)。
dsh added 1 commit 2026-08-20 18:16:25 +08:00
kevin merged commit 5d174caabb into main 2026-08-20 18:17:03 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/meshtastic_mqtt_server#1