From 15e611ebb6b0bc0070d5775898901bd9e1660c5e Mon Sep 17 00:00:00 2001 From: haneulai Date: Mon, 26 Jan 2026 10:56:19 +0900 Subject: [PATCH] fix: stats timezone issue (UTC to KST) --- app/routers/stats.py | 45 +++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/app/routers/stats.py b/app/routers/stats.py index c12981d..601e66c 100644 --- a/app/routers/stats.py +++ b/app/routers/stats.py @@ -6,7 +6,7 @@ from fastapi import APIRouter, HTTPException, Depends, Query from supabase import Client from typing import List, Literal -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from app.core.database import get_db @@ -157,14 +157,23 @@ async def get_plant_hourly_stats( 시간별 데이터 [{"hour": 0, "current_kw": ..., "today_kwh": ...}, ...] """ try: - today = datetime.now().date() - today_str = today.isoformat() + # KST (UTC+9) 시간대 설정 + 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") \ .select("current_kw, today_kwh, created_at") \ .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) \ .execute() @@ -173,12 +182,26 @@ async def get_plant_hourly_stats( for log in logs_result.data: created_at = log.get("created_at", "") if created_at: - # ISO 형식에서 시간 추출 - hour = int(created_at[11:13]) if len(created_at) > 13 else 0 - hourly_data[hour] = { - "current_kw": log.get("current_kw", 0) or 0, - "today_kwh": log.get("today_kwh", 0) or 0, - } + try: + # ISO 형식 파싱 (DB에서 UTC로 넘어온다고 가정) + dt = datetime.fromisoformat(created_at.replace('Z', '+00:00')) + + # 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시 전체 배열 생성 result = []