Хорошо, поэтому, если вам абсолютно необходимо использовать анализ продолжительности isodate, сохраните библиотеку isodate
.Однако я хотел бы отметить, что библиотека isodate является неполной, имеет ряд неправильных проектных решений и, как правило, является плохой.
Однако, если вам необходимо использовать их инструмент разбора, это, вероятно, хороший способ.
import isodate
import functools
@functools.total_ordering # if we implement < ==, will implement <=, >, >=
class Duration(isodate.Duration):
# inherit from isodate.Duration -- gives us ==
# constants
seconds_in_day = 60**2 * 24
approx_days_in_month = 30
approx_days_in_year = 365
def approx_total_seconds(self):
"""approx total seconds in duration"""
# self.months and self.years are stored as `Decimal`s for some reason...
return self.tdelta.total_seconds() \
+ float(self.months) * self.approx_days_in_month * self.seconds_in_day \
+ float(self.years) * self.approx_days_in_year * self.seconds_in_day
def __lt__(self, other):
"""defines self < other"""
if not isinstance(other, Duration):
return NotImplemented
return self.approx_total_seconds() < other.approx_total_seconds()
@classmethod
def parse_duration(cls, datestring):
"""a version of isodate.parse_duration that returns out class"""
iso_dur = isodate.parse_duration(datestring)
# iso_date.parse_duration can return either a Duration or a timedelta...
if isinstance(iso_dur, isodate.Duration):
return cls(seconds=iso_dur.tdelta.total_seconds(),
months=iso_dur.months, years=iso_dur.years)
else:
return cls(seconds=iso_dur.total_seconds())
ten_weeks = Duration.parse_duration('P10W')
one_year = Duration.parse_duration('P1Y')
print(ten_weeks.approx_total_seconds())
print(one_year.approx_total_seconds())
print(ten_weeks < one_year)
print(ten_weeks > one_year)
Выходы
6048000.0
31536000.0
True
False
Если вам не нужен анализ изодата (и я подозреваю, что вы этого не делаете), вы можете просто сделать
@functools.TotalOrdering
class ApproxTimeDelta:
approx_days_in_week = 7
approx_days_in_month = 30
approx_days_in_year = 365
def __init__(self, days, weeks, months, years):
self.days = days + \
weeks * self.approx_days_in_week + \
months * self.approx_days_in_month + \
years * self.approx_days_in_year
def __eq__(self, other):
return self.days == other.days
def __lt__(self, other):
return self.days < other.days
ипередайте годы / месяцы / недели / дни как целые числа и сравните их, как раньше.