## /utils/component/clock/time_class.py
from datetime import datetime
__all__ = [
'Time',
]
[документация]
class Time:
"""
Класс представляет промежуток времени с точностью до наносекунд.
Можно форматировать и получать в разных единицах.
"""
__slots__ = ('_total_ns')
def __init__(
self,
*,
years: float = 0,
days: float = 0,
hours: float = 0,
minutes: float = 0,
seconds: float = 0,
milliseconds: float = 0,
microseconds: float = 0,
nanoseconds: int = 0
) -> None:
"""
Инициализация объекта Time из указанных единиц.
:param years: Количество лет.
:param days: Количество дней.
:param hours: Количество часов.
:param minutes: Количество минут.
:param seconds: Количество секунд.
:param milliseconds: Количество миллисекунд.
:param microseconds: Количество микросекунд.
:param nanoseconds: Количество наносекунд.
"""
self._total_ns: int = int(
years * 365 * 24 * 3600 * 1_000_000_000 +
days * 24 * 3600 * 1_000_000_000 +
hours * 3600 * 1_000_000_000 +
minutes * 60 * 1_000_000_000 +
seconds * 1_000_000_000 +
milliseconds * 1_000_000 +
microseconds * 1_000 +
nanoseconds
)
[документация]
@classmethod
def from_datetime(cls, dt: datetime) -> 'Time':
"""
Создает объект Time из объекта datetime.
:param dt: Объект datetime.
:return: Новый объект Time.
"""
return cls(
years=dt.year,
days=dt.timetuple().tm_yday - 1,
hours=dt.hour,
minutes=dt.minute,
seconds=dt.second,
microseconds=dt.microsecond
)
def __add__(self, other: 'Time') -> 'Time':
"""
Складывает два объекта Time и возвращает новый.
:param other: Другой объект Time.
:return: Новый объект Time, равный сумме.
:raises: AttributeError, если other не Time
"""
if not isinstance(other, Time):
raise AttributeError('other must be of type Time')
return Time(nanoseconds=self._total_ns + other._total_ns)
def __sub__(self, other: 'Time') -> 'Time':
"""
Вычитает один объект Time из другого.
:param other: Объект Time для вычитания.
:return: Новый объект Time, равный разности.
:raises: AttributeError, если other не Time
"""
if not isinstance(other, Time):
raise AttributeError('other must be of type Time')
return Time(nanoseconds=self._total_ns - other._total_ns)
def __eq__(self, other: object) -> bool:
"""
Проверяет равенство двух объектов Time.
:param other: Другой объект.
:return: True, если равны, иначе False.
"""
return isinstance(other, Time) and self._total_ns == other._total_ns
def __lt__(self, other: 'Time') -> bool:
"""
Проверяет, меньше ли текущий объект, чем другой.
:param other: Другой объект Time.
:return: True, если текущий меньше, иначе False.
:raises: AttributeError, если other не Time
"""
if not isinstance(other, Time):
raise AttributeError('other must be of type Time')
return self._total_ns < other._total_ns
def __le__(self, other: 'Time') -> bool:
"""
Проверяет, меньше или равно ли текущее время другому.
:param other: Другой объект Time.
:return: True, если меньше или равно, иначе False.
:raises: AttributeError, если other не Time
"""
if not isinstance(other, Time):
raise AttributeError('other must be of type Time')
return self == other or self < other
def __str__(self) -> str:
"""
Строковое представление объекта.
:return: Отформатированная строка времени.
"""
return f'{self._total_ns / 1_000_000_000}'
def __repr__(self) -> str:
"""
Строковое представление объекта.
:return: Отформатированная строка времени.
"""
return self.format()
[документация]
def as_nanoseconds(self) -> int:
"""
Получить время в наносекундах.
:return: Время в наносекундах.
"""
return self._total_ns
[документация]
def as_microseconds(self) -> int:
"""
Получить время в микросекундах.
:return: Время в микросекундах.
"""
return self._total_ns // 1_000
[документация]
def as_milliseconds(self) -> int:
"""
Получить время в миллисекундах.
:return: Время в миллисекундах.
"""
return self._total_ns // 1_000_000
[документация]
def as_seconds(self) -> int:
"""
Получить время в секундах.
:return: Время в секундах.
"""
return self._total_ns // 1_000_000_000
[документация]
def as_minutes(self) -> int:
"""
Получить время в минутах.
:return: Время в минутах.
"""
return self.as_seconds() // 60
[документация]
def as_hours(self) -> int:
"""
Получить время в часах.
:return: Время в часах.
"""
return self.as_minutes() // 60
[документация]
def as_days(self) -> int:
"""
Получить время в днях.
:return: Время в днях.
"""
return self.as_hours() // 24
[документация]
def as_years(self) -> int:
"""
Получить время в годах.
:return: Время в годах.
"""
return self.as_days() // 365