Source code for dialogy.utils.datetime
from datetime import datetime
from typing import Callable, Union
import pytz
[docs]def is_unix_ts(ts: int) -> bool:
"""
Check if the input is a unix timestamp.
:param ts: A unix timestamp (13-digit).
:type ts: int
:return: True if :code:`ts` is a unix timestamp, else False.
:rtype: bool
"""
try:
datetime.fromtimestamp(ts / 1000)
return True
except ValueError:
return False
[docs]def dt2timestamp(date_time: datetime) -> int:
"""
Converts a python datetime object to unix-timestamp.
:param date_time: An instance of datetime.
:type date_time: datetime
:return: Unix timestamp integer.
:rtype: int
"""
return int(date_time.timestamp() * 1000)
[docs]def make_unix_ts(tz: str = "UTC") -> Callable[[str], int]:
"""
Convert date in ISO 8601 format to unix ms timestamp.
.. _make_unix_ts:
.. ipython ::
In [1]: from dialogy.utils.datetime import make_unix_ts
In [2]: ts = make_unix_ts("Asia/Kolkata")("2022-02-07T19:39:39.537827")
In [3]: ts == 1644241599537
:param tz: A timezone string, defaults to "UTC"
:type tz: Optional[str], optional
:return: A callable that converts a date in ISO 8601 format to unix ms timestamp.
:rtype: Callable[[str], int]
"""
def make_tz_aware(date_string: Union[str, int]) -> int:
"""
Convert date in ISO 8601 format to unix ms timestamp.
:param date_string: A date in ISO 8601 format.
:type date_string: str
:return: A unix timestamp (13 digit).
:rtype: int
"""
if isinstance(date_string, int):
return date_string
dt = datetime.fromisoformat(date_string)
if dt.tzinfo is None and tz not in pytz.all_timezones:
raise ValueError(f"Invalid timezone {tz} pick from:\n{pytz.all_timezones}")
if dt.tzinfo is None:
dt = dt.replace(tzinfo=pytz.timezone(tz))
return dt2timestamp(dt)
return make_tz_aware
[docs]def unix_ts_to_datetime(reference_time: int, timezone: str = "UTC") -> datetime:
return datetime.fromtimestamp(reference_time / 1000, pytz.timezone(timezone))