diff options
| author | Christian Cleberg <[email protected]> | 2026-04-09 19:45:45 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-09 19:45:45 -0500 |
| commit | acbff854f2da96bddcaede1385e7fefeba0fb34b (patch) | |
| tree | 48d4707cd3276d2825370f0793008a6ffcfff936 /src/srht_contrib/utils/dates.py | |
| download | hutch-stats-acbff854f2da96bddcaede1385e7fefeba0fb34b.tar.gz hutch-stats-acbff854f2da96bddcaede1385e7fefeba0fb34b.tar.bz2 hutch-stats-acbff854f2da96bddcaede1385e7fefeba0fb34b.zip | |
initial commit
Diffstat (limited to 'src/srht_contrib/utils/dates.py')
| -rw-r--r-- | src/srht_contrib/utils/dates.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/srht_contrib/utils/dates.py b/src/srht_contrib/utils/dates.py new file mode 100644 index 0000000..ad72968 --- /dev/null +++ b/src/srht_contrib/utils/dates.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from datetime import UTC, date, datetime, time, timedelta + + +def ensure_utc(dt: datetime) -> datetime: + if dt.tzinfo is None: + return dt.replace(tzinfo=UTC) + return dt.astimezone(UTC) + + +def parse_date(value: str) -> date: + return date.fromisoformat(value) + + +def parse_datetime(value: str) -> datetime: + normalized = value.replace("Z", "+00:00") + return ensure_utc(datetime.fromisoformat(normalized)) + + +def date_range(start: date, end: date) -> list[date]: + days: list[date] = [] + current = start + while current <= end: + days.append(current) + current += timedelta(days=1) + return days + + +def year_bounds(year: int) -> tuple[date, date]: + return date(year, 1, 1), date(year, 12, 31) + + +def date_to_utc_bounds(value: date) -> tuple[datetime, datetime]: + start = datetime.combine(value, time.min, tzinfo=UTC) + end = datetime.combine(value, time.max, tzinfo=UTC) + return start, end |
