fix: 修复统计聚合的时区问题,启动时自动回填缺失数据

- 统计聚合使用业务时区(APP_TIMEZONE)计算日期,而非UTC
- 新增 _get_business_day_range() 将业务日期转换为UTC时间范围
- 启动时检查并自动回填因容器重启等原因缺失的统计数据
- 修复 aggregate_daily_stats/update_summary/get_today_realtime_stats 等方法的时区计算
This commit is contained in:
fawney19
2025-12-12 10:06:07 +08:00
parent 5722b1422e
commit 39defce71c
2 changed files with 79 additions and 22 deletions

View File

@@ -154,9 +154,16 @@ class CleanupScheduler:
logger.info("开始执行统计数据聚合...")
from src.models.database import StatsDaily, User as DBUser
from src.services.system.scheduler import APP_TIMEZONE
from zoneinfo import ZoneInfo
now = datetime.now(timezone.utc)
today = now.replace(hour=0, minute=0, second=0, microsecond=0)
# 使用业务时区计算日期,确保与定时任务触发时间一致
# 定时任务在 Asia/Shanghai 凌晨 1 点触发,此时应聚合 Asia/Shanghai 的"昨天"
app_tz = ZoneInfo(APP_TIMEZONE)
now_local = datetime.now(app_tz)
today_local = now_local.replace(hour=0, minute=0, second=0, microsecond=0)
# 转换为 UTC 用于数据库查询stats_daily.date 存储的是 UTC
today = today_local.astimezone(timezone.utc).replace(tzinfo=timezone.utc)
if backfill:
# 启动时检查并回填缺失的日期