Appearance
时间与时区约定
两类时间
| 类型 | 字段示例 | 存储 | API | 展示 |
|---|---|---|---|---|
| 瞬时 | createdTime、paidAt、voidedTime | MySQL DATETIME + 连接池时区 | ISO 8601(Z) | PC:formatDateTimeFromApi(浏览器/用户时区);业务日勿用 |
| 业务日历日 | bizDate、laborDate、筛选 dateFrom/dateTo | 同上 | ISO 或 YYYY-MM-DD | formatBizYmdFromApi / ymdFromIso / valueYmdFromPath |
业务时区
- 默认
Asia/Shanghai(ACC_BUSINESS_TIMEZONE,见shared/utils/datetime.ts)。 - 与 MySQL 连接默认
DATABASE_MYSQL_TIMEZONE=+08:00(backend/.env.example)一致。 - Acc 站点业务日、列表筛选区间均按业务时区理解,不要对 ISO 使用
slice(0, 10)。
前端 / 小程序
- 筛选
dateFrom/dateTo:formatAccBizDateLocal(设备本地日历日字符串)。 - 过账
bizDate:formatAccBizDateIso(完整 ISO 瞬时,含时分时保留)。 - 列表业务日:
valueYmdFromPath(Web)、ymdFromIso(小程序)。 - 系统日志等瞬时:
formatDateTimeFromApi(frontend/src/shared/utils/datetime.ts)。
后端
- 实现来源:
@taskflow/shared/utils/datetime(与 Web/小程序同一文件);pnpm run build前会执行shared的build:backend-cjs产出 Node 20 可用的 CJS。 - 列表
dateFrom/dateTo:bizCalendarDayRange()(backend/src/libs/shared/datetime/biz-calendar-day-range.ts),勿new Date(ymd)+setHours。 - 首页趋势/本月:
startOfBusinessMonth、endOfTodayInTimeZone等(同上 shared 模块)。
首轮落地(2026-05)
- [x] Acc 业务日展示:
formatBizYmdFromApi/ymdFromIso/valueYmdFromPath - [x] Acc 列表筛选:
bizCalendarDayRange(后端各dateFrom/dateTo) - [x] 导出文件名:
formatExportYmdStamp/formatExportYmdCompact - [x] 单元测试:
backend/src/libs/shared/datetime/datetime.spec.ts
新代码自检
- [ ] 新增 Acc 日期展示未使用
slice(0, 10)/toISOString().slice(0, 10) - [ ] 新增日期筛选使用
bizCalendarDayRange - [ ] 导出文件名中的日期用
formatExportYmdStamp/formatExportYmdCompact(业务时区),勿toISOString().slice(0, 10)