Source code for datemore.datetime
# -*- coding: utf-8 -*-
import datetime
import typing
from typing import TYPE_CHECKING
import pytz
import datemore.date
import datemore.daterange
import datemore.time
import datemore.utils
if TYPE_CHECKING: # pragma: no cover
import pytz.tzfile
DatetimeType = typing.Union["Datetime", datetime.datetime]
DatesType = typing.Union[
"Datetime", "datemore.date.Date", datetime.datetime, datetime.date
]
[docs]class Datetime(datetime.datetime, datemore.daterange.Daterange):
[docs] @classmethod
def from_native(cls, _datetime: DatetimeType) -> "Datetime":
"""Creates a wrapped Datetime instance from a native datetime datetime
"""
ts = _datetime.timestamp()
return cls.fromtimestamp(ts)
[docs] @classmethod
def now(cls, tz: typing.Optional[typing.Any] = None) -> "Datetime":
"""Returns the current local Datetime
"""
now = cls.from_native(super().now())
return now.localize() or now
[docs] @classmethod
def today(cls) -> "Datetime":
"""Same as ``now()``
"""
return cls.now()
[docs] def localize(
self, timezone: pytz.tzfile = pytz.timezone("Europe/Berlin")
) -> typing.Optional["Datetime"]:
"""Returns a new Datetime instance that has been localized to a specific timezone
"""
try:
localized = timezone.localize(self)
return self.from_native(localized)
except Exception as e:
if "tzinfo is already set" in str(e):
return self
return None
[docs] def add_days(self, days: int) -> "Datetime":
"""Returns a new Datetime instance shifted by a given number of days
"""
new_date = datemore.utils.add_days(self, days=days)
if not isinstance(new_date, datetime.datetime):
raise TypeError
return self.from_native(new_date)
[docs] def add(self, **kwargs: int) -> "Datetime":
"""Returns a new Datetime instance shifted by given parameters
"""
new_date = datemore.utils.add_offset(self, **kwargs)
if not isinstance(new_date, datetime.datetime):
raise TypeError
return self.from_native(new_date)
[docs] def native(self) -> datetime.datetime:
"""Returns the underlying native datetime datetime instance
"""
ts = self.timestamp()
return datetime.datetime.fromtimestamp(ts)
[docs] def date(self) -> "datemore.date.Date":
"""Returns the Datetime's date as a Date instance
"""
date = super().date()
return datemore.date.Date(date.year, date.month, date.day)
[docs] def time(self) -> "datemore.time.Time":
"""Returns the Datetime's time as a Time instance
"""
time = super().time()
return datemore.time.Time(
time.hour, time.minute, time.second, time.microsecond, fold=time.fold
)
[docs] def is_on_weekend(self) -> bool:
"""Returns whether this Datetime is on a weekend or not
"""
return datemore.utils.is_on_weekend(self)
[docs] def range_to(self, end: "Datetime") -> typing.List["Datetime"]:
"""Returns a range of Datetime's between this Datetime and another Datetime
"""
return self.dates_between(start=self, end=end)