fix: stats timezone issue (UTC to KST)

This commit is contained in:
haneulai 2026-01-26 10:56:19 +09:00
parent 1aa4448f9f
commit 15e611ebb6

View File

@ -6,7 +6,7 @@
from fastapi import APIRouter, HTTPException, Depends, Query from fastapi import APIRouter, HTTPException, Depends, Query
from supabase import Client from supabase import Client
from typing import List, Literal from typing import List, Literal
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
from app.core.database import get_db from app.core.database import get_db
@ -157,14 +157,23 @@ async def get_plant_hourly_stats(
시간별 데이터 [{"hour": 0, "current_kw": ..., "today_kwh": ...}, ...] 시간별 데이터 [{"hour": 0, "current_kw": ..., "today_kwh": ...}, ...]
""" """
try: try:
today = datetime.now().date() # KST (UTC+9) 시간대 설정
today_str = today.isoformat() kst_timezone = timezone(timedelta(hours=9))
today_kst = datetime.now(kst_timezone).date()
today_str = today_kst.isoformat()
# 오늘의 모든 solar_logs 조회 (UTC 기준으로는 전날 15:00부터일 수 있으므로 넉넉하게 조회)
# 하지만 간단하게 '오늘' 날짜 문자열 필터링이 가장 안전 (DB가 UTC라면 보정 필요)
# 여기서는 created_at이 timestamptz라고 가정하고 단순 문자열 비교보다는 날짜 필터를 사용
# KST 00:00은 UTC로 전날 15:00
start_dt_kst = datetime.combine(today_kst, datetime.min.time()).replace(tzinfo=kst_timezone)
start_dt_utc = start_dt_kst.astimezone(timezone.utc)
# 오늘의 모든 solar_logs 조회
logs_result = db.table("solar_logs") \ logs_result = db.table("solar_logs") \
.select("current_kw, today_kwh, created_at") \ .select("current_kw, today_kwh, created_at") \
.eq("plant_id", plant_id) \ .eq("plant_id", plant_id) \
.gte("created_at", f"{today_str}T00:00:00") \ .gte("created_at", start_dt_utc.isoformat()) \
.order("created_at", desc=False) \ .order("created_at", desc=False) \
.execute() .execute()
@ -173,12 +182,26 @@ async def get_plant_hourly_stats(
for log in logs_result.data: for log in logs_result.data:
created_at = log.get("created_at", "") created_at = log.get("created_at", "")
if created_at: if created_at:
# ISO 형식에서 시간 추출 try:
hour = int(created_at[11:13]) if len(created_at) > 13 else 0 # ISO 형식 파싱 (DB에서 UTC로 넘어온다고 가정)
hourly_data[hour] = { dt = datetime.fromisoformat(created_at.replace('Z', '+00:00'))
"current_kw": log.get("current_kw", 0) or 0,
"today_kwh": log.get("today_kwh", 0) or 0, # UTC -> KST 변환
} dt_kst = dt.astimezone(kst_timezone)
# 오늘 날짜인지 확인
if dt_kst.date() != today_kst:
continue
hour = dt_kst.hour
# 해당 시간대의 마지막 데이터로 갱신 (order가 오름차순이므로 덮어쓰면 됨)
hourly_data[hour] = {
"current_kw": log.get("current_kw", 0) or 0,
"today_kwh": log.get("today_kwh", 0) or 0,
}
except ValueError:
continue
# 0시~23시 전체 배열 생성 # 0시~23시 전체 배열 생성
result = [] result = []