felicity-lims/felicity/core/dtz.py

73 lines
1.8 KiB
Python
Raw Normal View History

from datetime import datetime, timedelta
from dateutil import parser
from felicity.core.config import get_settings
settings = get_settings()
2024-09-25 00:12:10 +08:00
def __timenow() -> datetime:
if settings.TIMEZONE_AWARE:
now = datetime.now(settings.TIMEZONE)
else:
now = datetime.now()
2024-09-25 00:12:10 +08:00
return now
2024-09-25 00:12:10 +08:00
def timenow_str() -> str:
return __timenow().strftime(format=settings.DATETIME_STR_FORMAT)
2024-09-25 00:39:46 +08:00
2024-09-25 00:12:10 +08:00
def timenow_dt() -> datetime:
return datetime.strptime(timenow_str(), settings.DATETIME_STR_FORMAT)
2024-09-25 00:39:46 +08:00
def to_datetime(date_value: str) -> datetime:
return parser.parse(date_value)
2024-09-28 15:31:00 +08:00
def datetime_math(
date_val: str | datetime, days: int, addition: bool = True
) -> datetime:
if isinstance(date_val, str):
2024-09-28 15:29:22 +08:00
date_dt: datetime = to_datetime(date_val)
else:
date_dt = date_val
if addition:
2024-09-28 15:29:22 +08:00
return date_dt + timedelta(days=days) # noqa
else:
2024-09-28 15:29:22 +08:00
return date_dt - timedelta(days=days) # noqa
def format_datetime(
2024-09-28 15:31:00 +08:00
dat_value: str | datetime, human_format: bool = False, with_time: bool = True
) -> str:
if not dat_value:
return ""
if human_format:
if with_time:
_format = settings.DATETIME_HUMAN_FORMAT
else:
_format = settings.DATE_HUMAN_FORMAT
else:
if with_time:
_format = settings.DATETIME_STR_FORMAT
else:
_format = settings.DATE_STR_FORMAT
if isinstance(dat_value, datetime):
return dat_value.strftime(_format)
return to_datetime(dat_value).strftime(_format)
2024-09-28 15:29:22 +08:00
def make_tz_aware(unaware: str | datetime) -> datetime:
if isinstance(unaware, datetime):
return unaware.replace(tzinfo=settings.TIMEZONE)
return datetime.strptime(unaware, settings.DATETIME_STR_FORMAT).replace(
tzinfo=settings.TIMEZONE
)