This lists separate functions for date
and datetime
.
import datetime
from typing import Union
_BASE_DATE = datetime.date(1899, 12, 30)
_BASE_DATETIME = datetime.datetime(_BASE_DATE.year, _BASE_DATE.month, _BASE_DATE.day)
def convert_date_from_gsheet(num_days: int, /) -> datetime.date:
# Ref: https://stackoverflow.com/a/66738817/
assert isinstance(num_days, int)
return _BASE_GSHEET_DATE + datetime.timedelta(num_days)
def convert_date_to_gsheet(date: datetime.date, /) -> int:
# Ref: https://stackoverflow.com/a/66738817/
assert isinstance(date, datetime.date)
return (date - _BASE_GSHEET_DATE).days
def convert_datetime_to_gsheet(dt: datetime.datetime, /) -> float:
# Ref: https://stackoverflow.com/a/66738817/
assert isinstance(dt, datetime.datetime)
delta = dt - _BASE_GSHEET_DATETIME
return delta.days + delta.seconds / 86_400.0 # Note: datetime.timedelta(days=1).total_seconds() == 86_400.0
def convert_datetime_from_gsheet(num_days: Union[float, int], /) -> datetime.datetime:
# Ref: https://stackoverflow.com/a/66738817/
assert isinstance(num_days, (float, int))
return _BASE_GSHEET_DATETIME + datetime.timedelta(num_days)