49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
import os
|
|
from datetime import datetime, timedelta
|
|
|
|
import pytz
|
|
|
|
TZ = os.getenv('TZ', 'UTC')
|
|
|
|
|
|
def now(tz: str = TZ) -> datetime:
|
|
"""Returns the current datetime in the specified timezone.
|
|
|
|
If no timezone is provided, returns the current datetime in the local timezone.
|
|
"""
|
|
return datetime.now(pytz.timezone(tz))
|
|
|
|
|
|
def ttl(
|
|
*,
|
|
start_dt: datetime | None = None,
|
|
tz: str = TZ,
|
|
**kwargs,
|
|
) -> int:
|
|
"""Calculates the timestamp for a datetime in the future.
|
|
If start_dt is not provided, it uses the current datetime.
|
|
Additional keyword arguments specify the timedelta to add.
|
|
"""
|
|
if not start_dt:
|
|
start_dt = now(tz)
|
|
|
|
dt = start_dt + timedelta(**kwargs)
|
|
return int(dt.timestamp())
|
|
|
|
|
|
def timestamp(dt: datetime) -> int:
|
|
"""Converts a datetime object to a Unix timestamp."""
|
|
return int(dt.timestamp())
|
|
|
|
|
|
def fromisoformat(dt: str) -> datetime | None:
|
|
"""Parses a datetime string in ISO 8601 format and returns a datetime object.
|
|
Returns None if the string is not in a valid ISO 8601 format.
|
|
"""
|
|
try:
|
|
date = datetime.fromisoformat(dt)
|
|
except ValueError:
|
|
return None
|
|
else:
|
|
return date
|