# 更新规则与日期计算

## 榜单更新时间

| 榜单类型 | 更新时间 | 说明 |
|----------|----------|------|
| 日榜 | 每日 17:30 | 更新前一天数据 |
| 周榜 | 每周一 17:30 | 更新上周数据 |
| 月榜 | 每月2号 9点 | 更新上月数据 |

---

## 自动 offset 计算

根据当前时间是否已到更新时间，自动选择 offset：

| 榜单类型 | 当前时间 < 更新时间 | 当前时间 >= 更新时间 |
|----------|-------------------|-------------------|
| 日榜 | offset=2（取前2天） | offset=1（取前一天） |
| 周榜 | offset=2（取前2周） | offset=1（取前1周） |
| 月榜 | offset=2（取前2月） | offset=1（取前1月） |

---

## 日期计算公式

### 日榜
```
target_date = date.today() - timedelta(days=offset)
```

### 周榜
```
target_date = date.today() - timedelta(weeks=offset) 后的最近周一
target_sunday = target_monday + timedelta(days=6)
```

### 月榜
```
target_date = date.today() - timedelta(days=30*offset) 后的每月1号
target_last_day = 下月1号 - 1天
```

---

## 回溯范围校验

| 榜单类型 | 最大回溯 | 超出时提示语 |
|----------|----------|--------------|
| 日榜 | 过去7天 | "非常抱歉🙏，目前榜单最多支持回溯「过去7天」" |
| 周榜 | 过去3周 | "非常抱歉🙏，目前榜单最多支持回溯「过去3周」" |
| 月榜 | 过去3个月 | "非常抱歉🙏，目前榜单最多支持回溯「过去3月」" |

> ⚠️ **注意**：自动计算的日期（如"最新"）不受回溯窗口限制，脚本会自动调整 offset 取最近可用数据。

---

## 时间越界场景

当用户明确指定日期但超出范围时：

| 场景 | 提示语 |
|------|--------|
| 查询当日或未来日期 | `非常抱歉🙏，我们最新的是昨日/上周/上月的数据，将为您提供最接近您需求的昨日/上周/上月AI热榜。` |
| 查询超出回溯范围的历史日期 | `非常抱歉🙏，目前榜单最多支持回溯「过去X天/周/月」，我将为您查询最接近您需求的时间范围~` |

---

## 周期关键词识别

自动从用户文本中识别日/周/月（无明确则默认**日榜**）：

| 用户说 | 识别结果 |
|--------|----------|
| 含"周"、"周榜" | week |
| 含"月"、"月榜" | month |
| 其余默认 | day |

### 识别优先级
1. 优先识别周/月（长词优先）
2. 日/月/年中的"日"不参与识别（如"04月27日"中的"日"）
3. 无明确时间词时默认日榜

---

## 近期日期关键词

| 关键词 | 含义 |
|--------|------|
| 昨日、昨天 | offset=1 |
| 今日、今天 | offset=1 |
| 最新 | 根据更新时间自动计算 offset |
| 本周、这周 | 当前周 |
| 本月、这个月 | 当前月 |
