fa1027fa1b
- app/timezone.py 신설: KST 고정오프셋(+9, DST 없음) + now_kst/today_kst/to_kst_iso - DB 직렬화 created_at/updated_at/decided_at/uploaded_at 표시를 UTC→KST 로 변환 (expense/cupang/vacation db.py) - _now_iso(JSON 저장) KST 기준 - 라우터 date.today()/datetime.now() → today_kst()/now_kst() (달력 '오늘'/엑셀 파일명) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
"""프로젝트 공통 시간대 — 모든 시간은 한국 시간(KST, UTC+9)으로 표시/계산한다.
|
|
|
|
대한민국은 서머타임(DST)이 없으므로 고정 오프셋 +9 로 충분하다.
|
|
zoneinfo/tzdata 의존 없이 어디서나 동일하게 동작한다.
|
|
|
|
- DB 의 TIMESTAMPTZ 는 UTC 로 저장되고 psycopg 가 aware datetime(UTC)로 돌려준다.
|
|
표시 직전에 `to_kst_iso()` 로 KST 문자열로 변환한다.
|
|
- "오늘"/"지금" 판정은 `today_kst()` / `now_kst()` 를 쓴다(서버 로컬 TZ 무관).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date, datetime, timedelta, timezone
|
|
|
|
KST = timezone(timedelta(hours=9), name="KST")
|
|
|
|
|
|
def now_kst() -> datetime:
|
|
"""현재 시각(KST, tz-aware)."""
|
|
return datetime.now(KST)
|
|
|
|
|
|
def today_kst() -> date:
|
|
"""오늘 날짜(KST 기준)."""
|
|
return now_kst().date()
|
|
|
|
|
|
def now_kst_iso() -> str:
|
|
return now_kst().isoformat(timespec="seconds")
|
|
|
|
|
|
def to_kst_iso(dt: datetime | None, *, timespec: str = "seconds") -> str | None:
|
|
"""datetime → KST ISO 문자열. naive 는 UTC 로 간주 후 변환."""
|
|
if dt is None:
|
|
return None
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
return dt.astimezone(KST).isoformat(timespec=timespec)
|