7066: fix our algorithm based on jewish.c in sdn
It looks like we had an earlier fork of the same code, and the upstream had some bugs fixed. svn: r23131
This commit is contained in:
parent
dcf62ff1d9
commit
1cba16a406
@ -45,14 +45,15 @@ _JLN_SDN_OFFSET = 32083
|
|||||||
_JLN_DAYS_PER_5_MONTHS = 153
|
_JLN_DAYS_PER_5_MONTHS = 153
|
||||||
_JLN_DAYS_PER_4_YEARS = 1461
|
_JLN_DAYS_PER_4_YEARS = 1461
|
||||||
|
|
||||||
|
_HBR_HALAKIM_PER_HOUR = 1080
|
||||||
_HBR_HALAKIM_PER_DAY = 25920
|
_HBR_HALAKIM_PER_DAY = 25920
|
||||||
_HBR_HALAKIM_PER_LUNAR_CYCLE = 765433
|
_HBR_HALAKIM_PER_LUNAR_CYCLE = 29 * _HBR_HALAKIM_PER_DAY + 13753
|
||||||
_HBR_HALAKIM_PER_METONIC_CYCLE = 179876755
|
_HBR_HALAKIM_PER_METONIC_CYCLE = _HBR_HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7)
|
||||||
_HBR_SDN_OFFSET = 347997
|
_HBR_SDN_OFFSET = 347997
|
||||||
_HBR_NEW_MOON_OF_CREATION = 31524
|
_HBR_NEW_MOON_OF_CREATION = 31524
|
||||||
_HBR_NOON = 19440
|
_HBR_NOON = 18 * _HBR_HALAKIM_PER_HOUR
|
||||||
_HBR_AM3_11_20 = 9924
|
_HBR_AM3_11_20 = (9 * _HBR_HALAKIM_PER_HOUR) + 204
|
||||||
_HBR_AM9_32_43 = 16789
|
_HBR_AM9_32_43 = (15 * _HBR_HALAKIM_PER_HOUR) + 589
|
||||||
|
|
||||||
_HBR_SUNDAY = 0
|
_HBR_SUNDAY = 0
|
||||||
_HBR_MONDAY = 1
|
_HBR_MONDAY = 1
|
||||||
@ -122,9 +123,9 @@ def _tishri_molad(input_day):
|
|||||||
# really quite close.
|
# really quite close.
|
||||||
|
|
||||||
while molad_day < (input_day - 6940 + 310):
|
while molad_day < (input_day - 6940 + 310):
|
||||||
metonic_cycle = metonic_cycle + 1
|
metonic_cycle += 1
|
||||||
molad_halakim = molad_halakim + _HBR_HALAKIM_PER_METONIC_CYCLE
|
molad_halakim += _HBR_HALAKIM_PER_METONIC_CYCLE
|
||||||
molad_day = molad_day + ( molad_halakim // _HBR_HALAKIM_PER_DAY)
|
molad_day += molad_halakim // _HBR_HALAKIM_PER_DAY
|
||||||
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
|
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
|
||||||
|
|
||||||
# Find the molad of Tishri closest to this date.
|
# Find the molad of Tishri closest to this date.
|
||||||
@ -133,12 +134,11 @@ def _tishri_molad(input_day):
|
|||||||
if molad_day > input_day - 74:
|
if molad_day > input_day - 74:
|
||||||
break
|
break
|
||||||
|
|
||||||
molad_halakim = molad_halakim + (_HBR_HALAKIM_PER_LUNAR_CYCLE
|
molad_halakim += (_HBR_HALAKIM_PER_LUNAR_CYCLE
|
||||||
* _HBR_MONTHS_PER_YEAR[metonic_year])
|
* _HBR_MONTHS_PER_YEAR[metonic_year])
|
||||||
molad_day = molad_day + (molad_halakim // _HBR_HALAKIM_PER_DAY)
|
molad_day += molad_halakim // _HBR_HALAKIM_PER_DAY
|
||||||
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
|
molad_halakim = molad_halakim % _HBR_HALAKIM_PER_DAY
|
||||||
else:
|
|
||||||
metonic_year += 1
|
|
||||||
return (metonic_cycle, metonic_year, molad_day, molad_halakim)
|
return (metonic_cycle, metonic_year, molad_day, molad_halakim)
|
||||||
|
|
||||||
def _molad_of_metonic_cycle(metonic_cycle):
|
def _molad_of_metonic_cycle(metonic_cycle):
|
||||||
@ -161,10 +161,10 @@ def _molad_of_metonic_cycle(metonic_cycle):
|
|||||||
# will be in d1.
|
# will be in d1.
|
||||||
|
|
||||||
d2 = r2 // _HBR_HALAKIM_PER_DAY
|
d2 = r2 // _HBR_HALAKIM_PER_DAY
|
||||||
r2 = r2 - (d2 * _HBR_HALAKIM_PER_DAY)
|
r2 -= d2 * _HBR_HALAKIM_PER_DAY
|
||||||
r1 = (r2 << 16) | (r1 & 0xFFFF)
|
r1 = (r2 << 16) | (r1 & 0xFFFF)
|
||||||
d1 = r1 // _HBR_HALAKIM_PER_DAY
|
d1 = r1 // _HBR_HALAKIM_PER_DAY
|
||||||
r1 = r1 - ( d1 * _HBR_HALAKIM_PER_DAY)
|
r1 -= d1 * _HBR_HALAKIM_PER_DAY
|
||||||
|
|
||||||
molad_day = (d2 << 16) | d1
|
molad_day = (d2 << 16) | d1
|
||||||
molad_halakim = r1
|
molad_halakim = r1
|
||||||
@ -264,6 +264,7 @@ def hebrew_ymd(sdn):
|
|||||||
"""Convert an SDN number to a Julian calendar date."""
|
"""Convert an SDN number to a Julian calendar date."""
|
||||||
|
|
||||||
input_day = sdn - _HBR_SDN_OFFSET
|
input_day = sdn - _HBR_SDN_OFFSET
|
||||||
|
# TODO if input_day <= 0, the result is a date invalid in Hebrew calendar!
|
||||||
|
|
||||||
(metonic_cycle, metonic_year, day, halakim) = _tishri_molad(input_day)
|
(metonic_cycle, metonic_year, day, halakim) = _tishri_molad(input_day)
|
||||||
tishri1 = _tishri1(metonic_year, day, halakim)
|
tishri1 = _tishri1(metonic_year, day, halakim)
|
||||||
@ -284,9 +285,9 @@ def hebrew_ymd(sdn):
|
|||||||
# We need the length of the year to figure this out, so find
|
# 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
|
halakim += (_HBR_HALAKIM_PER_LUNAR_CYCLE
|
||||||
* _HBR_MONTHS_PER_YEAR[metonic_year])
|
* _HBR_MONTHS_PER_YEAR[metonic_year])
|
||||||
day = day + (halakim // _HBR_HALAKIM_PER_DAY)
|
day += halakim // _HBR_HALAKIM_PER_DAY
|
||||||
halakim = halakim % _HBR_HALAKIM_PER_DAY
|
halakim = halakim % _HBR_HALAKIM_PER_DAY
|
||||||
tishri1_after = _tishri1((metonic_year + 1) % 19, day, halakim)
|
tishri1_after = _tishri1((metonic_year + 1) % 19, day, halakim)
|
||||||
else:
|
else:
|
||||||
@ -320,24 +321,24 @@ def hebrew_ymd(sdn):
|
|||||||
day = input_day - tishri1 + 207
|
day = input_day - tishri1 + 207
|
||||||
if day > 0:
|
if day > 0:
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
month = month - 1
|
month -= 1
|
||||||
day = day + 30
|
day += 30
|
||||||
if day > 0:
|
if day > 0:
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
month = month - 1
|
month -= 1
|
||||||
day = day + 30
|
day += 30
|
||||||
else:
|
else:
|
||||||
month = 6
|
month = 6
|
||||||
day = input_day - tishri1 + 207
|
day = input_day - tishri1 + 207
|
||||||
if day > 0:
|
if day > 0:
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
month = month - 1
|
month -= 1
|
||||||
day = day + 30
|
day += 30
|
||||||
|
|
||||||
if day > 0:
|
if day > 0:
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
month = month - 1
|
month -= 1
|
||||||
day = day + 29
|
day += 29
|
||||||
if day > 0:
|
if day > 0:
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
|
|
||||||
@ -348,25 +349,23 @@ def hebrew_ymd(sdn):
|
|||||||
tishri1 = _tishri1(metonic_year, day, halakim)
|
tishri1 = _tishri1(metonic_year, day, halakim)
|
||||||
|
|
||||||
year_length = tishri1_after - tishri1
|
year_length = tishri1_after - tishri1
|
||||||
cday = input_day - tishri1 - 29
|
day = input_day - tishri1 - 29
|
||||||
if year_length == 355 or year_length == 385 :
|
if year_length == 355 or year_length == 385 :
|
||||||
# Heshvan has 30 days
|
# Heshvan has 30 days
|
||||||
if day <= 30:
|
if day <= 30:
|
||||||
month = 2
|
month = 2
|
||||||
day = cday
|
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
day = day - 30
|
day -= 30
|
||||||
else:
|
else:
|
||||||
# Heshvan has 29 days
|
# Heshvan has 29 days
|
||||||
if day <= 29:
|
if day <= 29:
|
||||||
month = 2
|
month = 2
|
||||||
day = cday
|
|
||||||
return (year, month, day)
|
return (year, month, day)
|
||||||
|
|
||||||
cday = cday - 29
|
day -= 29
|
||||||
|
|
||||||
# It has to be Kislev
|
# It has to be Kislev
|
||||||
return (year, 3, cday)
|
return (year, 3, day)
|
||||||
|
|
||||||
def julian_sdn(year, month, day):
|
def julian_sdn(year, month, day):
|
||||||
"""Convert a Julian calendar date to an SDN number."""
|
"""Convert a Julian calendar date to an SDN number."""
|
||||||
@ -573,3 +572,16 @@ def swedish_ymd(sdn):
|
|||||||
return gregorian_ymd(sdn)
|
return gregorian_ymd(sdn)
|
||||||
else:
|
else:
|
||||||
return julian_ymd(sdn)
|
return julian_ymd(sdn)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import sdn
|
||||||
|
|
||||||
|
hebrew_ymd = sdn.SdnToJewish # Fix bug# 7066
|
||||||
|
hebrew_sdn = sdn.JewishToSdn
|
||||||
|
#TODO maybe alias the other local invented wheels to Calendar convertors
|
||||||
|
|
||||||
|
except ImportError:
|
||||||
|
import logging
|
||||||
|
LOG = logging.getLogger(".calendar")
|
||||||
|
LOG.warn("sdn not available. "
|
||||||
|
"Install Calendar with pypi for native Hebrew calendar calculations.")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user