fix(timezone):修复触发告警记录的时间混乱问题

This commit is contained in:
2026-01-22 09:08:44 +08:00
parent 804c6a60e9
commit 13afc654ab
2 changed files with 48 additions and 30 deletions

View File

@@ -1,4 +1,4 @@
from datetime import datetime
from datetime import datetime, timezone, timedelta
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query, Body
@@ -23,6 +23,35 @@ class AlarmUpdateRequest(BaseModel):
processed: Optional[bool] = None
def convert_to_china_time(dt: Optional[datetime]) -> Optional[str]:
"""将 UTC 时间转换为中国时间 (UTC+8)"""
if dt is None:
return None
try:
china_tz = timezone(timedelta(hours=8))
if dt.tzinfo is None:
dt = dt.replace(tzinfo=timezone.utc)
return dt.astimezone(china_tz).isoformat()
except Exception:
return dt.isoformat() if dt else None
def format_alarm_response(alarm) -> dict:
"""格式化告警响应,将 UTC 时间转换为中国时间"""
return {
"id": alarm.id,
"camera_id": alarm.camera_id,
"roi_id": alarm.roi_id,
"event_type": alarm.event_type,
"confidence": alarm.confidence,
"snapshot_path": alarm.snapshot_path,
"llm_checked": alarm.llm_checked,
"llm_result": alarm.llm_result,
"processed": alarm.processed,
"created_at": convert_to_china_time(alarm.created_at),
}
@router.get("", response_model=List[dict])
def list_alarms(
camera_id: Optional[int] = None,
@@ -32,21 +61,7 @@ def list_alarms(
db: Session = Depends(get_db),
):
alarms = get_alarms(db, camera_id=camera_id, event_type=event_type, limit=limit, offset=offset)
return [
{
"id": alarm.id,
"camera_id": alarm.camera_id,
"roi_id": alarm.roi_id,
"event_type": alarm.event_type,
"confidence": alarm.confidence,
"snapshot_path": alarm.snapshot_path,
"llm_checked": alarm.llm_checked,
"llm_result": alarm.llm_result,
"processed": alarm.processed,
"created_at": alarm.created_at.isoformat() if alarm.created_at else None,
}
for alarm in alarms
]
return [format_alarm_response(alarm) for alarm in alarms]
@router.get("/stats")
@@ -62,18 +77,7 @@ def get_alarm(alarm_id: int, db: Session = Depends(get_db)):
alarm = next((a for a in alarms if a.id == alarm_id), None)
if not alarm:
raise HTTPException(status_code=404, detail="告警不存在")
return {
"id": alarm.id,
"camera_id": alarm.camera_id,
"roi_id": alarm.roi_id,
"event_type": alarm.event_type,
"confidence": alarm.confidence,
"snapshot_path": alarm.snapshot_path,
"llm_checked": alarm.llm_checked,
"llm_result": alarm.llm_result,
"processed": alarm.processed,
"created_at": alarm.created_at.isoformat() if alarm.created_at else None,
}
return format_alarm_response(alarm)
@router.put("/{alarm_id}")

View File

@@ -1,3 +1,4 @@
from datetime import datetime, timezone, timedelta
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Body
@@ -26,6 +27,19 @@ class CameraUpdateRequest(BaseModel):
enabled: Optional[bool] = None
def convert_to_china_time(dt: Optional[datetime]) -> Optional[str]:
"""将 UTC 时间转换为中国时间 (UTC+8)"""
if dt is None:
return None
try:
china_tz = timezone(timedelta(hours=8))
if dt.tzinfo is None:
dt = dt.replace(tzinfo=timezone.utc)
return dt.astimezone(china_tz).isoformat()
except Exception:
return dt.isoformat() if dt else None
@router.get("", response_model=List[dict])
def list_cameras(
enabled_only: bool = True,
@@ -40,7 +54,7 @@ def list_cameras(
"enabled": cam.enabled,
"fps_limit": cam.fps_limit,
"process_every_n_frames": cam.process_every_n_frames,
"created_at": cam.created_at.isoformat() if cam.created_at else None,
"created_at": convert_to_china_time(cam.created_at),
}
for cam in cameras
]
@@ -58,7 +72,7 @@ def get_camera(camera_id: int, db: Session = Depends(get_db)):
"enabled": camera.enabled,
"fps_limit": camera.fps_limit,
"process_every_n_frames": camera.process_every_n_frames,
"created_at": camera.created_at.isoformat() if camera.created_at else None,
"created_at": convert_to_china_time(camera.created_at),
}