You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.8 KiB
7.8 KiB
Service 文档时间戳规范修复
日期: 2026-01-28
类型: 文档修复
影响范围: docs/requirements/backend/04-services/**/*.md
概述
全面修复 Service 文档中的 datetime.utcnow 错误用法,统一使用 datetime.now(timezone.utc) 符合项目时区规范。
修复范围
共修复 12 个 Service 文档,涉及 50+ 处时间戳错误用法。
User 服务 (3个文档)
1. user-service.md
- 修复数量: 8 处
- 修复内容:
- Model 层时间戳字段:
created_at,updated_at,last_used_at - Service 层时间计算:
expires_at,deleted_at - 会话更新:
last_used_at
- Model 层时间戳字段:
修复示例:
# ❌ 错误
created_at: datetime = Field(default_factory=datetime.utcnow)
expires_at=datetime.utcnow() + timedelta(days=7)
# ✅ 正确
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
expires_at=datetime.now(timezone.utc) + timedelta(days=7)
2. sms-service.md
- 修复数量: 9 处
- 修复内容:
- Model 层时间戳字段:
created_at,updated_at - 验证码过期时间:
expires_at - 验证码清理:
cutoff_time - 验证码验证:
expires_at比较 - 软删除:
deleted_at
- Model 层时间戳字段:
修复示例:
# ❌ 错误
expires_at=datetime.utcnow() + timedelta(minutes=10)
cutoff_time = datetime.utcnow() - timedelta(hours=24)
# ✅ 正确
expires_at=datetime.now(timezone.utc) + timedelta(minutes=10)
cutoff_time = datetime.now(timezone.utc) - timedelta(hours=24)
3. wechat-service.md
- 修复数量: 5 处
- 修复内容:
- Model 层时间戳字段:
created_at,updated_at - 用户信息更新:
updated_at - 时间戳生成:
timestamp
- Model 层时间戳字段:
修复示例:
# ❌ 错误
user.updated_at = datetime.utcnow()
timestamp = int(datetime.utcnow().timestamp())
# ✅ 正确
user.updated_at = datetime.now(timezone.utc)
timestamp = int(datetime.now(timezone.utc).timestamp())
Project 服务 (6个文档)
4. folder-service.md
- 修复数量: 2 处
- 修复内容: Model 层时间戳字段
5. project-service.md
- 修复数量: 2 处
- 修复内容: Model 层时间戳字段(使用 Column 定义)
修复示例:
# ❌ 错误
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# ✅ 正确
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
6. project-resource-service.md
- 修复数量: 2 处
- 修复内容: Model 层时间戳字段
7. comment-service.md
- 修复数量: 3 处
- 修复内容:
- Model 层时间戳字段
- 评论解决时间:
resolved_at
修复示例:
# ❌ 错误
'resolved_at': datetime.utcnow()
# ✅ 正确
'resolved_at': datetime.now(timezone.utc)
8. screenplay-service.md
- 修复数量: 8 处
- 修复内容: 多个 Model 的时间戳字段(Screenplay, ScreenplayVersion, ScreenplayCharacter, ScreenplayScene, ScreenplayProp)
9. screenplay-tag-service.md
- 修复数量: 4 处
- 修复内容: ScreenplayTagDefinition 和 ScreenplayElementTag 的时间戳字段
10. storyboard-service.md
- 修复数量: 4 处
- 修复内容: Storyboard 和 StoryboardResource 的时间戳字段
修复示例:
# ❌ 错误
created_at: datetime = Field(
default_factory=datetime.utcnow,
sa_column=Column(DateTime(timezone=True))
)
# ✅ 正确
created_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc),
sa_column=Column(DateTime(timezone=True))
)
AI 服务 (1个文档)
11. ai-service.md
- 修复数量: 2 处
- 修复内容: AIJob Model 的时间戳字段
Resource 服务 (1个文档)
12. file-storage-service.md
- 修复数量: 3 处
- 修复内容:
- FileChecksum Model 的时间戳字段
- 文件访问时间更新:
last_accessed_at
修复示例:
# ❌ 错误
file_checksum.last_accessed_at = datetime.utcnow()
# ✅ 正确
file_checksum.last_accessed_at = datetime.now(timezone.utc)
Credit 服务 (已在之前修复)
credit-service.md
- 修复数量: 5 处
- 修复内容:
- 积分冻结时间:
frozen_at - 任务过期时间:
expires_at - 任务完成时间:
completed_at - 超时阈值计算:
timeout_threshold - 旧记录清理:
cutoff_date
- 积分冻结时间:
修复模式总结
1. Model 层时间戳字段(Field 定义)
# ❌ 错误
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# ✅ 正确
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
关键点: 必须使用 lambda 包装,否则所有实例共享同一时间戳。
2. Model 层时间戳字段(Column 定义)
# ❌ 错误
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# ✅ 正确
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
3. Service 层时间计算
# ❌ 错误
expires_at = datetime.utcnow() + timedelta(hours=24)
cutoff_time = datetime.utcnow() - timedelta(days=30)
# ✅ 正确
expires_at = datetime.now(timezone.utc) + timedelta(hours=24)
cutoff_time = datetime.now(timezone.utc) - timedelta(days=30)
4. Service 层时间更新
# ❌ 错误
user.updated_at = datetime.utcnow()
code.deleted_at = datetime.utcnow()
# ✅ 正确
user.updated_at = datetime.now(timezone.utc)
code.deleted_at = datetime.now(timezone.utc)
修复统计
| 服务类型 | 文档数量 | 修复数量 | 主要修复内容 |
|---|---|---|---|
| User 服务 | 3 | 22 | 时间戳字段、过期时间、软删除 |
| Project 服务 | 6 | 25 | 时间戳字段、评论解决时间 |
| AI 服务 | 1 | 2 | 时间戳字段 |
| Resource 服务 | 1 | 3 | 时间戳字段、访问时间 |
| Credit 服务 | 1 | 5 | 冻结时间、过期时间、完成时间 |
| 总计 | 12 | 57 | - |
规范符合性
修复后,所有 Service 文档完全符合项目时区规范:
- ✅ 所有 datetime 使用
datetime.now(timezone.utc) - ✅ 禁止使用已废弃的
datetime.utcnow() - ✅ Model 层使用
default_factory=lambda: datetime.now(timezone.utc) - ✅ Service 层时间计算使用 aware datetime
- ✅ 所有时间戳包含时区信息
相关规范
- 时区规范:
docs/architecture/datetime-timezone-standards.md - Backend 规范:
.claude/skills/jointo-tech-stack/references/backend.md > 时间与时区规范 - Database 规范:
.claude/skills/jointo-tech-stack/references/database.md
验证结果
# 验证命令
grep -r "datetime.utcnow" docs/requirements/backend/04-services/
# 验证结果
No matches found. # ✅ 所有错误用法已修复
后续建议
- 代码实现验证: 检查实际代码实现是否与文档一致
- 测试验证: 运行测试确保时区处理正确
- CI/CD 检查: 添加 pre-commit hook 检查
datetime.utcnow用法 - 文档审查: 定期审查新增文档是否符合时区规范
总结
本次修复全面清理了 Service 文档中的时间戳错误用法,统一使用 datetime.now(timezone.utc) 符合项目时区规范。修复涵盖 12 个文档、57 处错误用法,确保所有 Service 文档完全符合项目架构约束。