7034: probably_alive() failing when no birth-death
further refactoring of set_.../set2_... common code added accessor get_stop_ymd analogous to get_ymd svn: r23068
This commit is contained in:
parent
bdd08bc679
commit
e51987aab8
@ -1304,36 +1304,40 @@ class Date(object):
|
|||||||
self.__set_yr_mon_day(year, month, day,
|
self.__set_yr_mon_day(year, month, day,
|
||||||
Date._POS_RYR, Date._POS_RMON, Date._POS_RDAY)
|
Date._POS_RYR, Date._POS_RMON, Date._POS_RDAY)
|
||||||
|
|
||||||
|
def __set_yr_mon_day_offset(self, year, month, day, pos_yr, pos_mon, pos_day):
|
||||||
|
dv = list(self.dateval)
|
||||||
|
if dv[pos_yr]:
|
||||||
|
dv[pos_yr] += year
|
||||||
|
elif year:
|
||||||
|
dv[pos_yr] = year
|
||||||
|
if dv[pos_mon]:
|
||||||
|
dv[pos_mon] += month
|
||||||
|
elif month:
|
||||||
|
if month < 0:
|
||||||
|
dv[pos_mon] = 1 + month
|
||||||
|
else:
|
||||||
|
dv[pos_mon] = month
|
||||||
|
# Fix if month out of bounds:
|
||||||
|
if month != 0: # only check if changed
|
||||||
|
if dv[pos_mon] == 0: # subtraction
|
||||||
|
dv[pos_mon] = 12
|
||||||
|
dv[pos_yr] -= 1
|
||||||
|
elif dv[pos_mon] < 0: # subtraction
|
||||||
|
dv[pos_yr] -= int((-dv[pos_mon]) // 12) + 1
|
||||||
|
dv[pos_mon] = (dv[pos_mon] % 12)
|
||||||
|
elif dv[pos_mon] > 12 or dv[pos_mon] < 1:
|
||||||
|
dv[pos_yr] += int(dv[pos_mon] // 12)
|
||||||
|
dv[pos_mon] = dv[pos_mon] % 12
|
||||||
|
self.dateval = tuple(dv)
|
||||||
|
self._calc_sort_value()
|
||||||
|
return (day != 0 or dv[pos_day] > 28)
|
||||||
|
|
||||||
def set_yr_mon_day_offset(self, year=0, month=0, day=0):
|
def set_yr_mon_day_offset(self, year=0, month=0, day=0):
|
||||||
"""
|
"""
|
||||||
Offset the date by the given year, month, and day values.
|
Offset the date by the given year, month, and day values.
|
||||||
"""
|
"""
|
||||||
dv = list(self.dateval)
|
if self.__set_yr_mon_day_offset(year, month, day,
|
||||||
if dv[Date._POS_YR]:
|
Date._POS_YR, Date._POS_MON, Date._POS_DAY):
|
||||||
dv[Date._POS_YR] += year
|
|
||||||
elif year:
|
|
||||||
dv[Date._POS_YR] = year
|
|
||||||
if dv[Date._POS_MON]:
|
|
||||||
dv[Date._POS_MON] += month
|
|
||||||
elif month:
|
|
||||||
if month < 0:
|
|
||||||
dv[Date._POS_MON] = 1 + month
|
|
||||||
else:
|
|
||||||
dv[Date._POS_MON] = month
|
|
||||||
# Fix if month out of bounds:
|
|
||||||
if month != 0: # only check if changed
|
|
||||||
if dv[Date._POS_MON] == 0: # subtraction
|
|
||||||
dv[Date._POS_MON] = 12
|
|
||||||
dv[Date._POS_YR] -= 1
|
|
||||||
elif dv[Date._POS_MON] < 0: # subtraction
|
|
||||||
dv[Date._POS_YR] -= int((-dv[Date._POS_MON]) // 12) + 1
|
|
||||||
dv[Date._POS_MON] = (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._calc_sort_value()
|
|
||||||
if day != 0 or dv[Date._POS_DAY] > 28:
|
|
||||||
self.set_yr_mon_day(*self.offset(day), _update2 = False)
|
self.set_yr_mon_day(*self.offset(day), _update2 = False)
|
||||||
if self.is_compound():
|
if self.is_compound():
|
||||||
self.set2_yr_mon_day_offset(year, month, day)
|
self.set2_yr_mon_day_offset(year, month, day)
|
||||||
@ -1344,32 +1348,9 @@ class Date(object):
|
|||||||
of a compound date (range or span).
|
of a compound date (range or span).
|
||||||
"""
|
"""
|
||||||
self._assert_compound()
|
self._assert_compound()
|
||||||
dv = list(self.dateval)
|
if self.__set_yr_mon_day_offset(year, month, day,
|
||||||
if dv[Date._POS_RYR]:
|
Date._POS_RYR, Date._POS_RMON, Date._POS_RDAY):
|
||||||
dv[Date._POS_RYR] += year
|
stop = Date(self.get_stop_ymd())
|
||||||
elif year:
|
|
||||||
dv[Date._POS_RYR] = year
|
|
||||||
if dv[Date._POS_RMON]:
|
|
||||||
dv[Date._POS_RMON] += month
|
|
||||||
elif month:
|
|
||||||
if month < 0:
|
|
||||||
dv[Date._POS_RMON] = 1 + month
|
|
||||||
else:
|
|
||||||
dv[Date._POS_RMON] = month
|
|
||||||
# Fix if month out of bounds:
|
|
||||||
if month != 0: # only check if changed
|
|
||||||
if dv[Date._POS_RMON] == 0: # subtraction
|
|
||||||
dv[Date._POS_RMON] = 12
|
|
||||||
dv[Date._POS_RYR] -= 1
|
|
||||||
elif dv[Date._POS_RMON] < 0: # subtraction
|
|
||||||
dv[Date._POS_RYR] -= int((-dv[Date._POS_RMON]) / 12) + 1
|
|
||||||
dv[Date._POS_RMON] = (dv[Date._POS_RMON] % 12)
|
|
||||||
elif dv[Date._POS_RMON] > 12 or dv[Date._POS_RMON] < 1:
|
|
||||||
dv[Date._POS_RYR] += int(dv[Date._POS_RMON] / 12)
|
|
||||||
dv[Date._POS_RMON] = dv[Date._POS_RMON] % 12
|
|
||||||
self.dateval = tuple(dv)
|
|
||||||
if day != 0 or dv[Date._POS_RDAY] > 28:
|
|
||||||
stop = Date(dv[Date._POS_RYR], dv[Date._POS_RMON], dv[Date._POS_RDAY])
|
|
||||||
self.set2_yr_mon_day(*stop.offset(day))
|
self.set2_yr_mon_day(*stop.offset(day))
|
||||||
|
|
||||||
def copy_offset_ymd(self, year=0, month=0, day=0):
|
def copy_offset_ymd(self, year=0, month=0, day=0):
|
||||||
@ -1689,6 +1670,12 @@ class Date(object):
|
|||||||
"""
|
"""
|
||||||
return (self.get_year(), self.get_month(), self.get_day())
|
return (self.get_year(), self.get_month(), self.get_day())
|
||||||
|
|
||||||
|
def get_stop_ymd(self):
|
||||||
|
"""
|
||||||
|
Return (year, month, day) of the stop date, or all-zeros if it's not defined.
|
||||||
|
"""
|
||||||
|
return (self.get_stop_year(), self.get_stop_month(), self.get_stop_day())
|
||||||
|
|
||||||
def offset(self, value):
|
def offset(self, value):
|
||||||
"""
|
"""
|
||||||
Return (year, month, day) of this date +- value.
|
Return (year, month, day) of this date +- value.
|
||||||
|
Loading…
Reference in New Issue
Block a user