Fixed date arithmetic

svn: r9662
This commit is contained in:
Doug Blank 2007-12-31 21:23:48 +00:00
parent 9e110b55ed
commit 0cd7a685d6

View File

@ -252,10 +252,19 @@ class Date:
if type(other) == int: if type(other) == int:
return self.copy_offset_ymd(-other) return self.copy_offset_ymd(-other)
elif type(other) == type(self): # date elif type(other) == type(self): # date
diff = self.sortval - other.sortval d1 = self.get_ymd()
years = int(diff / 365) d2 = other.get_ymd()
months = int((diff - (years * 365)) / 30) if d1 < d2:
days = (diff - (years * 365)) - (months * 30) d1, d2 = d2, d1
days = d1[2] - d2[2]
months = d1[1] - d2[1]
years = d1[0] - d2[0]
if months < 0:
years -= 1
months = 12 + months
if days < 0:
months -= 1
days = 31 + days
return (years, months, days) return (years, months, days)
elif type(other) in [tuple, list]: elif type(other) in [tuple, list]:
return self.copy_offset_ymd(*map(lambda x: -x, other)) return self.copy_offset_ymd(*map(lambda x: -x, other))
@ -605,12 +614,18 @@ class Date:
dv[Date._POS_MON] += month dv[Date._POS_MON] += month
elif month: elif month:
dv[Date._POS_MON] = month dv[Date._POS_MON] = month
if dv[Date._POS_DAY]: # Fix if month out of bounds:
dv[Date._POS_DAY] += day if month != 0: # only check if changed
elif day: if dv[Date._POS_MON] <= 0: # subtraction
dv[Date._POS_DAY] = day dv[Date._POS_YR] -= int(-dv[Date._POS_MON] / 12)
dv[Date._POS_MON] = 13 - dv[Date._POS_MON] % 12
elif dv[Date._POS_MON] > 12 or dv[Date._POS_MON] < 1:
dv[Date._POS_YR] += int(dv[Date._POS_MON] / 12)
dv[Date._POS_MON] = dv[Date._POS_MON] % 12
self.dateval = tuple(dv) self.dateval = tuple(dv)
self._calc_sort_value() self._calc_sort_value()
if day != 0 or dv[Date_POS_DAY] > 28:
self.set_yr_mon_day(*self.offset(day))
def copy_offset_ymd(self, year=0, month=0, day=0): def copy_offset_ymd(self, year=0, month=0, day=0):
""" """
@ -845,6 +860,12 @@ class Date:
and self.get_year_valid() and self.get_month_valid() \ and self.get_year_valid() and self.get_month_valid() \
and self.get_day_valid() and self.get_day_valid()
def get_ymd(self):
"""
Returns (year, month, day)
"""
return (self.get_year(), self.get_month(), self.get_day())
def offset(self, value): def offset(self, value):
""" """
Returns (year, month, day) of this date +- value. Returns (year, month, day) of this date +- value.