fix: 时区统一北京时区 — Edge(UTC机器)三处时间处理修复

背景: Oracle Edge 机器为 UTC 时区,NAS 与视频均为北京时间,
网页要求统一北京时区。排查结论: NAS 端(北京时间)与 UI(直读
MariaDB)均正确,问题集中在 Edge 端三处。

1. queue_manager: 7 处 datetime('now','localtime') 在 UTC 机器上
   写入 UTC 时间(比北京慢8h),全部改为 datetime('now','+8 hours')
2. preprocessor.compute_timestamps: event_start_time 缺失时 fallback
   datetime.now() 用了 Edge 本地时间(UTC),改为北京时间
   datetime.now(timezone(+8h));带时区的 ISO 输入统一转北京时间
3. nvidia_adapter._ts_to_seconds: 不支持生产格式
   'YYYY-MM-DD HH:MM:SS'(split后int抛ValueError全部返回-1),
   导致集锦视频永远为空、视频模式永远降级逐帧——上一轮引入的
   bug,测试用 HH:MM:SS 格式未暴露。现支持两种格式;drawtext
   标签与提示词同步为完整时间戳说明

数据修正: event 17(task 298 手动测试缺 event_start_time)的
frame_timestamp 全为 UTC,按视频文件名真实时间(04:34:10)重算;
Edge 队列存量时间戳 +8h。

验证: 单测三例通过(生产格式解析/fallback北京时间/ISO带时区转换);
task 41 新代码正确写入北京时间 17:36:52。
This commit is contained in:
ericwyuan
2026-08-20 17:41:59 +08:00
parent 4553ec6f07
commit 795e8acc6c
3 changed files with 21 additions and 11 deletions

View File

@@ -82,8 +82,13 @@ class NvidiaVisionAdapter(BaseModelAdapter):
# ------------------------------------------------------------------
@staticmethod
def _ts_to_seconds(ts: str) -> float:
"""'HH:MM:SS' 'HH:MM:SS.mmm' -> """
parts = str(ts).strip().split(':')
"""'2026-08-20 04:34:10'(生产格式)/ 'HH:MM:SS' -> 当日秒偏移"""
s = str(ts).strip()
# 绝对时间格式: 取时间部分(同一天 30min 片段内足够)
date_part, _, time_part = s.partition(' ')
if time_part and '-' in date_part:
s = time_part
parts = s.split(':')
try:
if len(parts) == 3:
return int(parts[0]) * 3600 + int(parts[1]) * 60 + float(parts[2])
@@ -230,7 +235,7 @@ class NvidiaVisionAdapter(BaseModelAdapter):
ts_list = '\n'.join(f' 片段{i}: 原始时间 {ts}' for i, ts in enumerate(frame_timestamps, 1))
return f"""你是家庭监控视频分析助手。下面的视频是由一段长时间监控录像中抽取的片段集锦,
{len(frame_timestamps)} 个片段(每个约 3 秒),按顺序拼接。每个片段左上角叠加了
原始时间戳ts 后的 00-05-00 表示 00:05:00
原始时间戳ts 后的 2026-08-20 04-34-10 表示北京时间 2026年8月20日 04:34:10
片段时间对照:
{ts_list}