store: Fix: UTC/CST timezone ambiguity in transaction freeze/thaw scheduling — utils/timezone.py

This commit is contained in:
Cal Corum 2026-02-22 16:41:31 -06:00
parent 028a92c4e5
commit c5451edfa3

View File

@ -0,0 +1,63 @@
---
id: 4579c929-165e-4e96-a0f2-3604febf1734
type: fix
title: "Fix: UTC/CST timezone ambiguity in transaction freeze/thaw scheduling — utils/timezone.py"
tags: [major-domo, timezone, transaction-freeze, production-fix, discord-bot, python, fix]
importance: 0.75
confidence: 0.8
created: "2026-02-22T22:41:31.654639+00:00"
updated: "2026-02-22T22:41:31.654639+00:00"
---
# Fix: UTC/CST Timezone Ambiguity in Transaction Freeze/Thaw Scheduling
## Project
major-domo / discord-app-v2
## Problem
Production container (`major-domo-discord-app-1` on Akamai) had ambiguous timezone config — `/etc/localtime` pointed to `Etc/UTC` but `date` reported CST. The transaction freeze/thaw task used `datetime.now()` (naive, relying on OS timezone), causing scheduling to fire at unpredictable wall-clock times.
Additionally, `utils/logging.py` used `datetime.now().isoformat() + "Z"` — appending "Z" to a naive datetime is misleading (Z means UTC but the datetime had no tzinfo).
## Root Cause
- `datetime.now()` with no timezone argument produces a naive datetime, inheriting the OS/container timezone implicitly
- Container timezone config was inconsistent between `/etc/localtime` and the OS `date` command output
- Never rely on OS timezone in containerized environments
## Fix
1. Created `utils/timezone.py` with centralized timezone helpers:
```python
from zoneinfo import ZoneInfo
from datetime import datetime, UTC
CHICAGO_TZ = ZoneInfo("America/Chicago")
def now_utc() -> datetime:
return datetime.now(UTC)
def now_chicago() -> datetime:
return datetime.now(CHICAGO_TZ)
def to_chicago(dt: datetime) -> datetime:
return dt.astimezone(CHICAGO_TZ)
def to_discord_timestamp(dt: datetime) -> str:
# Returns Discord <t:unix:R> format
...
```
2. Changed `tasks/transaction_freeze.py` line 300:
- Before: `datetime.now()`
- After: `now_chicago()`
3. Fixed `utils/logging.py` JSON timestamp:
- Before: `datetime.now().isoformat() + "Z"` (misleading Z on naive datetime)
- After: `datetime.now(UTC).isoformat()` (proper `+00:00` UTC suffix)
## Verification
JSON logs show datetime with `-06:00` CST offset and timestamp with `+00:00` UTC. Confirmed working in production after deploy.
## References
- PR #45 into `next-release`, merged to `main`
- Closes Gitea issue #43
- Key file: `utils/timezone.py` (new), `tasks/transaction_freeze.py`, `utils/logging.py`