fix: stats timezone issue (UTC to KST)
This commit is contained in:
parent
1aa4448f9f
commit
15e611ebb6
|
|
@ -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로 넘어온다고 가정)
|
||||||
|
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] = {
|
hourly_data[hour] = {
|
||||||
"current_kw": log.get("current_kw", 0) or 0,
|
"current_kw": log.get("current_kw", 0) or 0,
|
||||||
"today_kwh": log.get("today_kwh", 0) or 0,
|
"today_kwh": log.get("today_kwh", 0) or 0,
|
||||||
}
|
}
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
|
||||||
# 0시~23시 전체 배열 생성
|
# 0시~23시 전체 배열 생성
|
||||||
result = []
|
result = []
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user