# toISOString() 时区偏移导致日期显示偏一天（2026-09-07）

## 症状

订单管理「本周/本月/本季/本年」日期范围显示错乱——「本月」显示成 `8/31 ~ 9/7`（正确应为 `9/1 ~ 9/7`）。
连带受影响：客诉「本周新增」过滤起点、拜访日期默认值、AI 回答文件名、经验标题默认日期，全部偏 -1 天。
用户反馈：「数据简直乱七八糟」。

## 根因

`date.toISOString().slice(0,10)` 或 `new Date().toISOString().slice(0,10)` 取的是 **UTC 时间**。
中国 UTC+8，本地 `9/1 00:00` = UTC `8/31 16:00`，`slice(0,10)` 截到 `8/31`。
凡本地日 00:00 时刻的 Date 对象，toISOString 必偏 -1 天。

## 正确做法

取日期一律用本地时间格式化，禁用 `toISOString().slice`：

```javascript
var fmtDate = function(d) { return d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0') + '-' + String(d.getDate()).padStart(2,'0'); };
var today = function() { var d = new Date(); return fmtDate(d); };
```

| 场景 | 错误写法 | 正确写法 |
|------|---------|---------|
| 范围起止日期 | `range.start.toISOString().slice(0,10)` | `fmtDate(range.start)` |
| 今天默认值 | `new Date().toISOString().slice(0,10)` | `today()` |
| 存时间戳（CloudBase） | `new Date().toISOString()` | **保留不改**（UTC 标准） |

只改带 `.slice(...)` 取日期的地方；完整 `toISOString()` 存时间戳是标准做法，勿动。

## 排查

```bash
grep -n "toISOString().slice" 工具/index.html
```

## ⚠️ 双文件陷阱

工作台有两套前端，代码高度相似但独立：
- `工具/index.html` — **正式工作台**，cb_sync.sh 部署到 `/workbench/index.html`（用户实际访问的）
- `工具/app.html` — 测试页（无飞书限制）

改 bug 必须**两个都改**，且先确认用户访问的是哪个（正式是 index.html）。
本次先改了 app.html 后发现用户访问的是 index.html，白改一遍——教训：先定位部署链路再动手。
