7066: bug in hebrew_ymd

merge from trunk

svn: r23134
This commit is contained in:
Vassilii Khachaturov 2013-09-14 23:54:39 +00:00
parent 3ab55427a1
commit b5ad90d317
2 changed files with 54 additions and 47 deletions

View File

@ -23,7 +23,7 @@
"""
Provide calendar to sdn (serial date number) conversion.
"""
from __future__ import division
#-------------------------------------------------------------------------
#
# Python modules
@ -110,9 +110,9 @@ def _tishri_molad(input_day):
loop below will correct for any error in this estimate.
"""
metonic_cycle = (input_day + 310) / 6940
metonic_cycle = (input_day + 310) // 6940
# Calculate the time of the starting molad for this metonic cycle. */
# Calculate the time of the starting molad for this metonic cycle.
(molad_day, molad_halakim) = _molad_of_metonic_cycle(metonic_cycle)
@ -124,7 +124,7 @@ def _tishri_molad(input_day):
while molad_day < (input_day - 6940 + 310):
metonic_cycle = metonic_cycle + 1
molad_halakim = molad_halakim + _HBR_HALAKIM_PER_METONIC_CYCLE
molad_day = molad_day + ( molad_halakim / _HBR_HALAKIM_PER_DAY)
molad_day = molad_day + ( molad_halakim // _HBR_HALAKIM_PER_DAY)
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
# Find the molad of Tishri closest to this date.
@ -135,7 +135,7 @@ def _tishri_molad(input_day):
molad_halakim = molad_halakim + (_HBR_HALAKIM_PER_LUNAR_CYCLE
* _HBR_MONTHS_PER_YEAR[metonic_year])
molad_day = molad_day + (molad_halakim / _HBR_HALAKIM_PER_DAY)
molad_day = molad_day + (molad_halakim // _HBR_HALAKIM_PER_DAY)
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
else:
metonic_year += 1
@ -160,10 +160,10 @@ def _molad_of_metonic_cycle(metonic_cycle):
# upper 16 bits of the quotient will be in d2 and the lower 16 bits
# will be in d1.
d2 = r2 / _HBR_HALAKIM_PER_DAY
d2 = r2 // _HBR_HALAKIM_PER_DAY
r2 = r2 - (d2 * _HBR_HALAKIM_PER_DAY)
r1 = (r2 << 16) | (r1 & 0xFFFF)
d1 = r1 / _HBR_HALAKIM_PER_DAY
d1 = r1 // _HBR_HALAKIM_PER_DAY
r1 = r1 - ( d1 * _HBR_HALAKIM_PER_DAY)
molad_day = (d2 << 16) | d1
@ -175,13 +175,13 @@ def _start_of_year(year):
"""
Calculate the start of the year.
"""
metonic_cycle = (year - 1) / 19
metonic_cycle = (year - 1) // 19
metonic_year = (year - 1) % 19
(molad_day, molad_halakim) = _molad_of_metonic_cycle(metonic_cycle)
molad_halakim = molad_halakim + (_HBR_HALAKIM_PER_LUNAR_CYCLE
* _HBR_YEAR_OFFSET[metonic_year])
molad_day = molad_day + (molad_halakim / _HBR_HALAKIM_PER_DAY)
molad_day = molad_day + (molad_halakim // _HBR_HALAKIM_PER_DAY)
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
pTishri1 = _tishri1(metonic_year, molad_day, molad_halakim)
@ -209,7 +209,7 @@ def hebrew_sdn(year, month, day):
# Find the end of the year.
molad_halakim = molad_halakim + (_HBR_HALAKIM_PER_LUNAR_CYCLE
*_HBR_MONTHS_PER_YEAR[metonic_year])
molad_day = molad_day + (molad_halakim / _HBR_HALAKIM_PER_DAY)
molad_day = molad_day + (molad_halakim // _HBR_HALAKIM_PER_DAY)
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
tishri1_after = _tishri1((metonic_year + 1)
% 19, molad_day, molad_halakim)
@ -282,11 +282,11 @@ def hebrew_ymd(sdn):
return (year, month, day)
# We need the length of the year to figure this out, so find
# Tishri 1 of the next year. */
# Tishri 1 of the next year.
halakim = halakim + (_HBR_HALAKIM_PER_LUNAR_CYCLE
* _HBR_MONTHS_PER_YEAR[metonic_year])
day = day + (halakim / _HBR_HALAKIM_PER_DAY)
day = day + (halakim // _HBR_HALAKIM_PER_DAY)
halakim = halakim % _HBR_HALAKIM_PER_DAY
tishri1_after = _tishri1((metonic_year + 1) % 19, day, halakim)
else:
@ -383,8 +383,8 @@ def julian_sdn(year, month, day):
month += 9
year -= 1
return (year * _JLN_DAYS_PER_4_YEARS)/4 \
+ (month * _JLN_DAYS_PER_5_MONTHS+2)/5 \
return (year * _JLN_DAYS_PER_4_YEARS) // 4 \
+ (month * _JLN_DAYS_PER_5_MONTHS + 2) // 5 \
+ day - _JLN_SDN_OFFSET
def julian_ymd(sdn):
@ -392,13 +392,13 @@ def julian_ymd(sdn):
temp = (sdn + _JLN_SDN_OFFSET) * 4 - 1
# Calculate the year and day of year (1 <= day_of_year <= 366)
year = temp / _JLN_DAYS_PER_4_YEARS
day_of_year = (temp % _JLN_DAYS_PER_4_YEARS) / 4 + 1
year = temp // _JLN_DAYS_PER_4_YEARS
day_of_year = (temp % _JLN_DAYS_PER_4_YEARS) // 4 + 1
# Calculate the month and day of month
temp = day_of_year * 5 - 3
month = temp / _JLN_DAYS_PER_5_MONTHS
day = (temp % _JLN_DAYS_PER_5_MONTHS) / 5 + 1
month = temp // _JLN_DAYS_PER_5_MONTHS
day = (temp % _JLN_DAYS_PER_5_MONTHS) // 5 + 1
# Convert to the normal beginning of the year
if month < 10:
@ -428,9 +428,9 @@ def gregorian_sdn(year, month, day):
month += 9
year -= 1
return(((year / 100) * _GRG_DAYS_PER_400_YEARS) / 4
+ ((year % 100) * _GRG_DAYS_PER_4_YEARS) / 4
+ (month * _GRG_DAYS_PER_5_MONTHS + 2) / 5
return(((year // 100) * _GRG_DAYS_PER_400_YEARS) // 4
+ ((year % 100) * _GRG_DAYS_PER_4_YEARS) // 4
+ (month * _GRG_DAYS_PER_5_MONTHS + 2) // 5
+ day
- _GRG_SDN_OFFSET )
@ -439,17 +439,17 @@ def gregorian_ymd(sdn):
temp = (_GRG_SDN_OFFSET + sdn) * 4 - 1
# Calculate the century (year/100)
century = temp / _GRG_DAYS_PER_400_YEARS
century = temp // _GRG_DAYS_PER_400_YEARS
# Calculate the year and day of year (1 <= day_of_year <= 366)
temp = ((temp % _GRG_DAYS_PER_400_YEARS) / 4) * 4 + 3
year = (century * 100) + (temp / _GRG_DAYS_PER_4_YEARS)
day_of_year = (temp % _GRG_DAYS_PER_4_YEARS) / 4 + 1
temp = ((temp % _GRG_DAYS_PER_400_YEARS) // 4) * 4 + 3
year = (century * 100) + (temp // _GRG_DAYS_PER_4_YEARS)
day_of_year = (temp % _GRG_DAYS_PER_4_YEARS) // 4 + 1
# Calculate the month and day of month
temp = day_of_year * 5 - 3
month = temp / _GRG_DAYS_PER_5_MONTHS
day = (temp % _GRG_DAYS_PER_5_MONTHS) / 5 + 1
month = temp // _GRG_DAYS_PER_5_MONTHS
day = (temp % _GRG_DAYS_PER_5_MONTHS) // 5 + 1
# Convert to the normal beginning of the year
if month < 10 :
@ -466,7 +466,7 @@ def gregorian_ymd(sdn):
def french_sdn(year, month, day):
"""Convert a French Republican Calendar date to an SDN number."""
sdn = (year*_FR_DAYS_PER_4_YEARS)/4 + \
sdn = (year*_FR_DAYS_PER_4_YEARS) // 4 + \
(month-1)*_FR_DAYS_PER_MONTH + \
day + _FR_SDN_OFFSET
# do not convert dates before 22.9.1792 or after 1.1.1806
@ -480,10 +480,10 @@ def french_ymd(sdn):
# only between 22.9.1792 and 1.1.1806
if sdn >= 2375840 and sdn <= 2380688:
temp = (sdn-_FR_SDN_OFFSET)*4 - 1
year = temp/_FR_DAYS_PER_4_YEARS
day_of_year = (temp%_FR_DAYS_PER_4_YEARS)/4
month = (day_of_year/_FR_DAYS_PER_MONTH)+1
day = (day_of_year%_FR_DAYS_PER_MONTH)+1
year = temp // _FR_DAYS_PER_4_YEARS
day_of_year = (temp % _FR_DAYS_PER_4_YEARS) // 4
month = (day_of_year // _FR_DAYS_PER_MONTH) + 1
day = (day_of_year % _FR_DAYS_PER_MONTH) + 1
return (year, month, day)
else:
return gregorian_ymd(sdn)
@ -501,31 +501,31 @@ def persian_sdn(year, month, day):
v1 = (month - 1) * 31
else:
v1 = ((month - 1) * 30) + 6
v2 = math.floor(((epyear * 682) - 110) / 2816)
v2 = ((epyear * 682) - 110) // 2816
v3 = (epyear - 1) * 365 + day
v4 = math.floor(epbase / 2820) * 1029983
v4 = (epbase // 2820) * 1029983
return int(math.ceil(v1 + v2 + v3 + v4 + _PRS_EPOCH - 1))
def persian_ymd(sdn):
"""Convert an SDN number to a Persian calendar date."""
sdn = math.floor(sdn) + 0.5
sdn = math.floor(sdn) + 0.5 #float
depoch = sdn - 2121446
cycle = math.floor(depoch / 1029983)
cyear = depoch % 1029983
depoch = sdn - 2121446 #float
cycle = math.floor(depoch / 1029983) #int
cyear = depoch % 1029983 #int
if cyear == 1029982:
ycycle = 2820
else:
aux1 = math.floor(cyear / 366)
aux2 = cyear % 366
ycycle = math.floor(((2134*aux1)+(2816*aux2)+2815)/1028522) + aux1 + 1
aux1 = cyear // 366 #int
aux2 = cyear % 366 #int
ycycle = (((2134*aux1)+(2816*aux2)+2815) // 1028522) + aux1 + 1
year = ycycle + (2820 * cycle) + 474
if year <= 0:
year = year - 1
yday = sdn - persian_sdn(year, 1, 1) + 1
yday = sdn - persian_sdn(year, 1, 1) + 1 #float !
if yday < 186:
month = math.ceil(yday / 31)
else:
@ -537,15 +537,15 @@ def islamic_sdn(year, month, day):
"""Convert an Islamic date to an SDN number."""
v1 = math.ceil(29.5 * (month - 1))
v2 = (year - 1) * 354
v3 = math.floor((3 + (11 *year)) / 30)
v3 = math.floor((3 + (11 *year)) // 30)
return int(math.ceil((day + v1 + v2 + v3 + _ISM_EPOCH) - 1))
def islamic_ymd(sdn):
"""Convert an SDN number to an Islamic calendar date."""
sdn = math.floor(sdn) + 0.5
year = int(math.floor(((30*(sdn-_ISM_EPOCH))+10646)/10631))
month = int(min(12, math.ceil((sdn-(29+islamic_sdn(year, 1, 1)))/29.5) + 1))
year = int(math.floor(((30*(sdn-_ISM_EPOCH))+10646) / 10631))
month = int(min(12, math.ceil((sdn-(29+islamic_sdn(year, 1, 1))) / 29.5) + 1))
day = int((sdn - islamic_sdn(year, month, 1)) + 1)
return (year, month, day)
@ -553,7 +553,7 @@ def swedish_sdn(year, month, day):
"""Convert a Swedish date to an SDN number."""
datum = (year, month, day)
# Swedish Calendar
if (1700,3,1) <= datum <= (1712,2,30):
if (1700, 3, 1) <= datum <= (1712, 2, 30):
return julian_sdn(year, month, day) -1
# Gregorian Calendar (1753-03-01)
elif (1753, 3, 1) <= datum:
@ -564,7 +564,7 @@ def swedish_sdn(year, month, day):
def swedish_ymd(sdn):
"""Convert an SDN number to a Swedish calendar date."""
if sdn == 2346425:
return (1712,2,30)
return (1712, 2, 30)
# Swedish Calendar
elif 2342042 <= sdn < 2346425:
return julian_ymd(sdn+1)

View File

@ -326,6 +326,12 @@ def show_settings():
except:
gsversion_str = 'Ghostscript not in system PATH'
try:
import sdn
sdn_str = sdn.__version__
except ImportError:
sdn_str = 'not found'
os_path = os.environ.get('PATH','not set')
os_path = os_path.split(os.pathsep)
@ -345,6 +351,7 @@ def show_settings():
print ' cairo : %s' % cairover_str
print ' osmgpsmap : %s' % osmgpsmap_str
print ' pyexiv2 : %s' % pyexiv2_str
print ' sdn : %s' % sdn_str
print ' o.s. : %s' % operating_system
if kernel:
print ' kernel : %s' % kernel