#445: B.C.E and dates conversion on french_calendar

svn: r11681
This commit is contained in:
Jérôme Rapinat 2009-01-22 10:15:01 +00:00
parent 6815af9303
commit 28ee7ee1a8
3 changed files with 32 additions and 28 deletions

View File

@ -89,6 +89,13 @@ def swedish_valid(date_tuple):
valid = False valid = False
return valid return valid
def french_valid(date_tuple):
valid = True
# year 1 starts on 22.9.1792
if date_tuple[2] < 1:
valid = False
return valid
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Parser class # Parser class
@ -354,7 +361,7 @@ class DateParser:
def _parse_french(self, text): def _parse_french(self, text):
return self._parse_calendar(text, self._ftext, self._ftext2, return self._parse_calendar(text, self._ftext, self._ftext2,
self.french_to_int) self.french_to_int, french_valid)
def _parse_greg_julian(self, text): def _parse_greg_julian(self, text):
return self._parse_calendar(text, self._text, self._text2, return self._parse_calendar(text, self._text, self._text2,
@ -428,6 +435,8 @@ class DateParser:
check = gregorian_valid check = gregorian_valid
if subparser == self._parse_swedish: if subparser == self._parse_swedish:
check = swedish_valid check = swedish_valid
if subparser == self._parse_french:
check = french_valid
else: else:
check = None check = None

View File

@ -186,6 +186,9 @@ class DateParserFR(DateParser):
#islamic #islamic
self._itext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._imon_str, self._itext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._imon_str,
re.IGNORECASE) re.IGNORECASE)
#swedish
self._stext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._smon_str,
re.IGNORECASE)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -247,7 +250,7 @@ class DateDisplayFR(DateDisplay):
else: else:
value = "%s %d, %s" % (self.MONS[date_val[1]], date_val[0], year) value = "%s %d, %s" % (self.MONS[date_val[1]], date_val[0], year)
elif self.format == 4: elif self.format == 4:
# Day Month Year # Day. Month Year
if date_val[0] == 0: if date_val[0] == 0:
if date_val[1] == 0: if date_val[1] == 0:
value = year value = year
@ -258,7 +261,7 @@ class DateDisplayFR(DateDisplay):
# value = "%d %s %s" % (date_val[0], self._months[date_val[1]], year) # value = "%d %s %s" % (date_val[0], self._months[date_val[1]], year)
value = "%d. %s %s" % (date_val[0], self._months[date_val[1]], year) value = "%d. %s %s" % (date_val[0], self._months[date_val[1]], year)
else: else:
# Day MON Year # Day. MON Year
if date_val[0] == 0: if date_val[0] == 0:
if date_val[1] == 0: if date_val[1] == 0:
value = year value = year
@ -273,23 +276,6 @@ class DateDisplayFR(DateDisplay):
else: else:
return value return value
def _display_french(self, date_val):
year = date_val[2]
if date_val[0] == 0:
if date_val[1] == 0:
return year
else:
return u"%s %d" % (self.french[date_val[1]], year)
# convertion mistake before 22.9.1792
elif date_val[2] == 0 and date_val[1] == 13:
# from 17.9.1792 to 21.9.1792 : trap for Extra months, we cannot date back
return self._bce_str % year
# on 1792 before 22.9.1792, no negative years
elif date_val[2] < 0:
return self._bce_str % year
# valid dates on 1792
else:
return u"%s %s %d" % (date_val[0], self.french[date_val[1]], year)
def display(self, date): def display(self, date):
""" """

View File

@ -466,18 +466,27 @@ def gregorian_ymd(sdn):
def french_sdn(year, month, day): def french_sdn(year, month, day):
"""Convert a French Republican Calendar date to an SDN number.""" """Convert a French Republican Calendar date to an SDN number."""
return (year*_FR_DAYS_PER_4_YEARS)/4 + \ sdn = (year*_FR_DAYS_PER_4_YEARS)/4 + \
(month-1)*_FR_DAYS_PER_MONTH + \ (month-1)*_FR_DAYS_PER_MONTH + \
day + _FR_SDN_OFFSET day + _FR_SDN_OFFSET
# do not convert dates before 22.9.1792 or after 1.1.1806
if sdn < 2375840 or sdn > 2380688 :
return gregorian_sdn(year, month, day)
else:
return sdn
def french_ymd(sdn): def french_ymd(sdn):
"""Convert an SDN number to a French Republican Calendar date.""" """Convert an SDN number to a French Republican Calendar date."""
# only between 22.9.1792 and 1.1.1806
if sdn >= 2375840 and sdn <= 2380688:
temp = (sdn-_FR_SDN_OFFSET)*4 - 1 temp = (sdn-_FR_SDN_OFFSET)*4 - 1
year = temp/_FR_DAYS_PER_4_YEARS year = temp/_FR_DAYS_PER_4_YEARS
day_of_year = (temp%_FR_DAYS_PER_4_YEARS)/4 day_of_year = (temp%_FR_DAYS_PER_4_YEARS)/4
month = (day_of_year/_FR_DAYS_PER_MONTH)+1 month = (day_of_year/_FR_DAYS_PER_MONTH)+1
day = (day_of_year%_FR_DAYS_PER_MONTH)+1 day = (day_of_year%_FR_DAYS_PER_MONTH)+1
return (year, month, day) return (year, month, day)
else:
return gregorian_ymd(sdn)
def persian_sdn(year, month, day): def persian_sdn(year, month, day):
"""Convert a Persian date to an SDN number.""" """Convert a Persian date to an SDN number."""