python实现的阳历转阴历(农历)算法

2019-10-06 17:15:58王冬梅

        self.year   =year
        self.month  =month
        self.day    =day
        self.weekday=weekday
        self.gan    =gan
        self.zhi    =zhi

solar1st = Date(0, 0, 30, weekday=2)   #Wednesday, January 31, 1900
lunar1st = Date(0, 0, 0,  weekday=2, gan=6, zhi=0)
#Wednesday, First day, First month, 1900, 庚子年

 

def error(msg):
    print 'Error:', msg; exit(0)

 

def isSolarLeapYear (year):
    year=year+1900
    return (year%4 == 0) and (year%100 != 0) or (year%400 == 0)

 

baseYear=1201 - 1900
# in fact, real baseYear=1201.  In order to ease calculation of
# leap years. real baseYear must conform to:
#   realBaseYear%4==1 and realBaseYear%400==1.
# Assert realBaseYear < solar1st.year .

# Compute the number of days from the Solar First Date
# month=0 means January, ...
def solarDaysFromBaseYear(d):    #d is a Date class
    delta = d.year - baseYear
    offset = delta*365 + delta/4 - delta/100 + delta/400
    for i in range(d.month):
     offset += daysInSolarMonth[i];
    if d.month>1 and isSolarLeapYear(d.year):
 offset += 1
    offset += d.day
##   print '___', year, month, day, 'offset=', offset ########
    return offset

# Compute the number of days from the Solar First Date
# month=0 means January, ..., year=0 means 1900, ...
def solarDaysFromFirstDate (d): #d is a Date class
    return solarDaysFromBaseYear (d) - solarDaysFromBaseYear (solar1st)

 

def calcLunarDaysPerMonth(iYear):
    code = yearCode[iYear]
    leapMonth = code&0xf #leapMonth==0 means no lunar leap month

    code >>= 4
    for iMonth in range(12):
        yearInfo[iYear].monthDays[11-iMonth] = lunarMonthDays [code&0x1]
        code >>= 1

    if leapMonth>0:
        yearInfo[iYear].leapMonth = leapMonth-1
        yearInfo[iYear].monthDays.insert (leapMonth,
                lunarMonthDays [code & 0x1])
 


def calcAllLunarYearsInfo():
    for iYear in range(yearsCoded):
        calcLunarDaysPerMonth (iYear)
        for iMonth in range(13):