File size: 1,243 Bytes
76b303c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"""Display-side time helpers.

Timestamps are STORED in UTC (see models.py / route writes — do not change that).
These helpers exist only to render UTC values in Eastern time (America/New_York,
which automatically handles EST vs EDT) for human-facing output: web UI, PDF, DOCX.
"""
from datetime import datetime, timezone
from zoneinfo import ZoneInfo

EASTERN = ZoneInfo("America/New_York")

# Default display format used across the portal (e.g. "06/25/2026 02:00 PM").
DEFAULT_FMT = "%m/%d/%Y %I:%M %p"


def to_eastern(dt: datetime | None) -> datetime | None:
    """Convert a stored UTC datetime to Eastern. Naive values are assumed UTC."""
    if dt is None:
        return None
    if dt.tzinfo is None:  # legacy naive rows were written as UTC
        dt = dt.replace(tzinfo=timezone.utc)
    return dt.astimezone(EASTERN)


def fmt_eastern(dt: datetime | None, fmt: str = DEFAULT_FMT, default: str = "—") -> str:
    """Format a stored UTC datetime in Eastern time, or return `default` if None."""
    eastern = to_eastern(dt)
    return eastern.strftime(fmt) if eastern else default


def now_eastern() -> datetime:
    """Current time in Eastern (for 'generated on' / 'submitted on' footers)."""
    return datetime.now(EASTERN)