시간대 혼재: 모델 기본값은 datetime.utcnow(UTC), 수동 매매 등 일부 경로는 _get_kst_now(KST)로 저장해 같은 테이블에 9시간 차가 섞였다(화면 매매시각 02:14 등). 조회 구간(utcnow - days)도 KST 저장분과 비교돼 어긋났고, 추가매수 쿨다운은 (UTC now - KST created_at)이 음수라 상시 발동했다. app.core.timeutil.now_kst() 도입 후 모델 기본값 27곳과 app/ 전역 utcnow() 호출을 모두 KST 기준으로 통일(잔존 0건, 테스트로 고정). KIS 토큰 캐시(~/.cache/auto-stock)가 컨테이너에만 있어 배포마다 사라지고 토큰을 새로 발급받다 KIS가 EGW00103(유효하지 않은 AppKey)로 거부 → 502·잔고 0 유발. 볼륨 마운트로 재배포 후에도 재사용. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
27 lines
953 B
Python
27 lines
953 B
Python
"""timeutil — 애플리케이션 전역 시각 기준.
|
|
|
|
[2026-09-23] DB 타임스탬프가 UTC/KST 로 섞여 있었다.
|
|
- 모델 기본값(`default=datetime.utcnow`)으로 저장된 행 → UTC
|
|
- `_get_kst_now()` 를 명시한 경로(수동 매매 등) → KST
|
|
같은 테이블 안에서 9시간 차이가 나 화면의 매매 시각이 뒤죽박죽이었고,
|
|
`now_kst()` 로 만든 조회 구간과 비교하는 로직도 9시간씩 어긋났다
|
|
(예: 추가매수 쿨다운이 항상 발동).
|
|
|
|
국내 증시만 다루고 모든 비교가 KST 거래일 기준이므로 **KST naive** 로 통일한다.
|
|
"""
|
|
from datetime import date, datetime
|
|
|
|
import pytz
|
|
|
|
KST = pytz.timezone("Asia/Seoul")
|
|
|
|
|
|
def now_kst() -> datetime:
|
|
"""현재 한국 시간 (timezone-naive) — DB 저장·비교의 유일한 기준."""
|
|
return datetime.now(KST).replace(tzinfo=None)
|
|
|
|
|
|
def today_kst() -> date:
|
|
"""오늘 날짜 (KST)."""
|
|
return now_kst().date()
|