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

ThisPythonscriptistoshowSolarandLunarcalenderatthesametime.YouneedtohavePython(2.0orabove)installed.

Acceptabledaterange:1900/2--2049/12

OutputcontainsChinesecharacters(mainlandGB2312encoding),mustbeviewedinaChinese-enabledsystemor"cxterm"etc.programmsunderUNIXX-Windows.

Themajorreferenceformetocomposethisprogramis:lunar-2.1.tgz(1992),composedbyFungF.LeeandRickyYeung.

AndLeeandYeungreferedto:1."Zhong1guo2yin1yang2ri4yue4dui4zhao4wan4nian2li4"byLin2Qi3yuan2.《中国阴阳日月对照万年历》.林2."Ming4li3ge2xin1zi3ping2cui4yan2"byXu2Le4wu2.《命理革新子平粹言》.徐3.Da1zhong4wan4nian2li4.《大众万年历》

Version:0.3.2,Jan/16/2007,accordingtosprite'sinformation,changed3codes:1954:0x0a5d0-->0x0a5b0,1956:0x052d0-->0x052b01916:0x0d6a0-->0x056a00.3.1,Jan/15/2007,changed1978'scodefrom0xb5a0to0xb6a0.Ayounglady'sbirthday(lunar1978/8/4)problemreportedoninternet--informedbyspriteatlinuxsir.org0.3.0,Sep/25/2006,addcodingline,preventpythontoreportwarning0.2.0,Jan/6/2002,ShengXiao(生肖),lunarleapmonth(闰月)added.0.1.0,Jan/4/2002

---ChangsenXu'''

#Remember,inthisprogram:#month=0meansJanuaray,month=1meansFebruary...;#day=0meansthefirstdayofamonth,day=1meansthesecondday,#soastoeasemanipulationofPythonlists.#year=0is1900,untilthelaststeptooutput

daysInSolarMonth=[31,28,31,30,31,30,31,31,30,31,30,31]lunarMonthDays=[29,30]#ashort(long)lunarmonthhas29(30)days*/

shengXiaoEn=["Mouse","Ox","Tiger","Rabbit","Dragon","Snake","Horse","Goat","Monkey","Rooster","Dog","Pig"]shengXiaoGB=["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]zhiGB=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]ganGB=["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]

monthEn=['January','February','March','April','May','June','July','August','September','October','November','December']weekdayEn=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]weekdayGB=["一","二","三","四","五","六","日"]numGB=['○',"一","二","三","四","五","六","七","八","九","十"]lunarHoliday={'0_0':'春节','4_4':'端午','7_14':'中秋','8_8':'重阳','0_14':'元宵'}

fromsysimportargv,exit,stdoutfromtimeimporttime,localtimeow=stdout.write

classLunarYearInfo:def__init__(self):self.yearDays=0self.monthDays=[0]*13self.leapMonth=-1#-1meansnolunarleapmonth

yearInfo=[0]*yearsCoded#globalvariableforiinrange(yearsCoded):yearInfo[i]=LunarYearInfo()

classDate:def__init__(self,year,month,day,weekday=-1,gan=-1,zhi=-1):self.year=yearself.month=monthself.day=dayself.weekday=weekdayself.gan=ganself.zhi=zhi

solar1st=Date(0,0,30,weekday=2)#Wednesday,January31,1900lunar1st=Date(0,0,0,weekday=2,gan=6,zhi=0)#Wednesday,Firstday,Firstmonth,1900,庚子年

deferror(msg):print'Error:',msg;exit(0)

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

baseYear=1201-1900#infact,realbaseYear=1201.Inordertoeasecalculationof#leapyears.realbaseYearmustconformto:#realBaseYear%4==1andrealBaseYear%400==1.#AssertrealBaseYear

#ComputethenumberofdaysfromtheSolarFirstDate#month=0meansJanuary,...defsolarDaysFromBaseYear(d):#disaDateclassdelta=d.year-baseYearoffset=delta*365+delta/4-delta/100+delta/400foriinrange(d.month):offset+=daysInSolarMonth[i];ifd.month>1andisSolarLeapYear(d.year):offset+=1offset+=d.day##print'___',year,month,day,'offset=',offset########returnoffset

#ComputethenumberofdaysfromtheSolarFirstDate#month=0meansJanuary,...,year=0means1900,...defsolarDaysFromFirstDate(d):#disaDateclassreturnsolarDaysFromBaseYear(d)-solarDaysFromBaseYear(solar1st)

defcalcLunarDaysPerMonth(iYear):code=yearCode[iYear]leapMonth=code&0xf#leapMonth==0meansnolunarleapmonth

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

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

defcalcAllLunarYearsInfo():foriYearinrange(yearsCoded):calcLunarDaysPerMonth(iYear)foriMonthinrange(13):yearInfo[iYear].yearDays+=yearInfo[iYear].monthDays[iMonth]

#inputdateSolar,return(dateLunar,isLunarMonthOrNot)defsolar2Lunar(d):#disaDateclassdLunar=Date(-1,-1,-1)#unknownlunarDateclass

offset=solarDaysFromFirstDate(d)

dLunar.weekday=(offset+solar1st.weekday)%7

foriYearinrange(yearsCoded):ifoffsetdLunar.year=iYear;breakoffset-=yearInfo[iYear].yearDaysifdLunar.year==-1:error("Dateoutofrange.")

dLunar.gan=(dLunar.year+lunar1st.gan)%10dLunar.zhi=(dLunar.year+lunar1st.zhi)%12

foriMonthinrange(13):ifoffsetdLunar.month=iMonth;breakoffset-=yearInfo[dLunar.year].monthDays[iMonth]

dLunar.day=offsetisLeapMonth=0ifyearInfo[dLunar.year].leapMonth>=0:ifdLunar.month==yearInfo[iYear].leapMonth+1:isLeapMonth=1ifdLunar.month>yearInfo[dLunar.year].leapMonth:dLunar.month-=1

return(dLunar,isLeapMonth)

defgetSolarDaysInMonth(year,month):ifisSolarLeapYear(year)andmonth==1:return29else:returndaysInSolarMonth[month]

defnum2GB(num):ifnum==10:return'十'elifnum>10andnumreturn'十'+numGB[num-10]

tmp=''whilenum>10:tmp=numGB[num%10]+tmpnum=int(num/10)tmp=numGB[num]+tmpreturntmp

deflunarDate2GB(dLunar,isLeapMonth):tmp=str(dLunar.month)+'_'+str(dLunar.day)iflunarHoliday.has_key(tmp):return'[0;33;44m%s[0m'%lunarHoliday[tmp]+''*(6-len(lunarHoliday[tmp]))elifdLunar.day==0:tmp2='闰'*isLeapMonth+num2GB(dLunar.month+1)+'月'return'[7m%s[0m'%tmp2+''*(8-len(tmp2))elifdLunar.dayreturn'初'+num2GB(dLunar.day+1)else:returnnum2GB(dLunar.day+1)

defoutputCalendar(year,month):dLunar=Date(-1,-1,-1)ow('阳历%d年%d月'%(year+1900,month+1))

foriDayinrange(getSolarDaysInMonth(year,month)):dSolar=Date(year,month,iDay)dLunar,isLeapMonth=solar2Lunar(dSolar)

ifiDay==0:ow('始于阴历%s年%s%s月(%s%s年,生肖属%s)'%(num2GB(dLunar.year+1900),'闰'*isLeapMonth,num2GB(dLunar.month+1),ganGB[dLunar.gan],zhiGB[dLunar.zhi],shengXiaoGB[dLunar.zhi]))ow('='*74+'')foriinrange(7):ow("%3s%2s"%(weekdayEn[i][:3],weekdayGB[i]))ow('')foriinrange(dLunar.weekday):ow(''*11)

elifdLunar.weekday==0:ow('')

ow("%2d%-8s"%(iDay+1,lunarDate2GB(dLunar,isLeapMonth)))ow('')

defcheckArgv(argv):argc=len(argv)ifargc==1orargv[1]in('-h','--help'):print__doc__;exit(0)

#incasepeopleinputargumentsas"4-digit-yearmonth"ifargc==3andlen(argv[1])==4andlen(argv[2])in(1,2):argv[1],argv[2]=argv[2],argv[1]

#Getmonthmonth=-1foriMonthinrange(12):ifargv[1].lower()==monthEn[iMonth].lower()orargv[1].lower()==monthEn[iMonth][:3].lower():month=iMonth+1;breakifmonth==-1:month=eval(argv[1])

ifmonth12:error("Monthnotwithin1--12.")

#Getyearifargc==2:year=localtime(time())[0]else:iflen(argv[2])!=4:error("Yearmustbe4digits.")year=eval(argv[2])ifyear=1900+yearsCodedor(year==1900andmonth==1):error("Yearmustbewithin%d--%d,excluding1900/1."%(1900,1900+yearsCoded-1))

returnyear-1900,month-1

year,month=checkArgv(argv)calcAllLunarYearsInfo()outputCalendar(year,month)

这个也有问题(1989年8月的数据转换成农历就有问题)

同学给了一个lua的程序,我试了一下,还没有找到错误的,先直接给上程序(直接从lua转成python的,写的比较乱)

defGetDayOf(st):#–天干名称cTianGan=["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]#–地支名称cDiZhi=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]#–属相名称cShuXiang=["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]#–农历日期名cDayName=["*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"]#–农历月份名cMonName=["*","正","二","三","四","五","六","七","八","九","十","十一","腊"]

#–公历每月前面的天数wMonthAdd=[0,31,59,90,120,151,181,212,243,273,304,334]#–农历数据wNongliData=[2635,333387,1701,1748,267701,694,2391,133423,1175,396438,3402,3749,331177,1453,694,201326,2350,465197,3221,3402,400202,2901,1386,267611,605,2349,137515,2709,464533,1738,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,268949,3402,3493,133973,1386,464219,605,2349,334123,2709,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877]

#–计算农历天干、地支、月、日—nIsEnd=0m=0whilenIsEnd!=1:#ifwNongliData[m+1]ifwNongliData[m]k=11else:k=12n=kwhilen>=0:nBit=wNongliData[m]foriinrange(n):nBit=math.floor(nBit/2);

nBit=nBit%2

ifnTheDatenIsEnd=1break

nTheDate=nTheDate–29–nBitn=n–1

ifnIsEnd!=0:breakm=m+1

wCurYear=1921+mwCurMonth=k–n+1wCurDay=int(math.floor(nTheDate))ifk==12:ifwCurMonth==wNongliData[m]/65536+1:wCurMonth=1–wCurMonthelifwCurMonth>wNongliData[m]/65536+1:wCurMonth=wCurMonth–1

print'阳历',st["year"],st["mon"],st["day"]print'农历',wCurYear,wCurMonth,wCurDay#–生成农历天干、地支、属相==>wNongli–szShuXiang=cShuXiang[(((wCurYear-4)%60)%12)+1]szShuXiang=cShuXiang[(((wCurYear-4)%60)%12)+1]zNongli=szShuXiang+'('+cTianGan[(((wCurYear-4)%60)%10)]+cDiZhi[(((wCurYear-4)%60)%12)]+')年'#–szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear-4)%60)%10],cDiZhi[((wCurYear-4)%60)%12]);

#–生成农历月、日==>wNongliDay–*/ifwCurMonthszNongliDay="闰"+cMonName[(-1*wCurMonth)]else:szNongliDay=cMonName[wCurMonth]

szNongliDay=szNongliDay+"月"+cDayName[wCurDay]printszNongliDay#returnszNongli..szNongliDay

defmain():st={"year":1989,"mon":8,"day":1}GetDayOf(st)st1={"year":2013,"mon":10,"day":7}GetDayOf(st1)st1={"year":2013,"mon":10,"day":1}GetDayOf(st1)#print(""..GetDayOf(st))main()

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

THE END
1.中国农历年份,rpa,机器人,自动化在线日历日历中的历法又分为阴历、阳历和阴阳合历,三种。 阳历亦即太阳历,其历年为一个回归年,现时国际通用的公历(格里高利历)和中国的干支历即属于太阳历这类。更多内容请查看https://wannianrili.bmcx.com/ 日历网万年历_日历网1 天前?·?日历网提供的万年历主要包含万年历查询表,万年历1900-2099年日历https://wdlinux.cn/html/zonghe/20241128/20015.html
2.农历是阴历还是阳历转换农历俗称阴历,但实际上是由于农历本身含有节气概念,所以农历是阴阳合历,取月相的变化周期即朔望月为月的长度,参考太阳回归年为年的长度,通过设置二十四节气以及闰月以使平均历年与回归年相适应。农历和阳历没有确定的转换公式,但是可以通过查找万年历进行转换。农历和http://m.15tqc.com/show1048661/
3.生肖属相,是按“阴历”算,还是按照“阳历”计算?中国的生肖是按照阴历(农历)来计算的,而非阳历(公历)。生肖是根据农历年份的天干地支组合而成的,共有十二种生肖,每种生肖对应一个农历年份。生肖文化在中国有着悠久的历史,深刻地影响了人们的日常生活、文学艺术、传统习俗等方面。 1. 阴历与阳历的区别 https://www.16757.com/ysh/bazi/5197.html
4.国历和农历怎么转换网友分享:三 国历或公历换算为中国农历 回历换算为农历 仅管中国农历各年在年内月数日数都不是一个相对的稳定值,给回历与公历换算为农历上带来较多的困难,但仍然可以换算。中国农历为阴阳合历,在月份上与回历同属太阴历,惟回历每月以见。 6、国历与农历的换算公式 求教高人!!! https://www.105188.com/sh/618011.html
5.中国农历,有详细的阴历算法资源这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法 和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目 的. 很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的 愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后https://download.csdn.net/detail/ss6321983/914080
6.中国农历,有详细的阴历算法中国农历,有详细的阴历算法_农历算法,农历算法Et**on 上传43.55 KB 文件格式 rar 这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法 和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目 的. 很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小https://www.coder100.com/index/index/content/id/1356739
7.中国农历的算法(含周算法,节气,阴历与阴历对应)王峰炬最重要的是周的算法: public static int dayOfWeek(int y, int m, int d) { int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日 y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次 int ly = ..https://www.cnblogs.com/fengju/archive/2011/09/13/6174521.html
8.77算法是农历还是阴历?试管百科我们需要先了解一下“77算法”究竟是什么。该算法源自中国传统文化,用于确定特定年份的农历闰月。虽然农历和阴历都是基于月亮运行周期的历法,但它们在计算方法上有所不同。 农历和阴历的区别 农历:中国古代用于农事的历法,基于农业生产季节和农民生活的需要。阴历:一种以月亮运行周期为基础的历法,主要用于宗教、节日和https://www.jiudunet.com/sg/show-1205744
9.星座看的是阴历生日还是阳历生日接亲网一、星座看的是阴历生日还是阳历生日 星座是按阳历。星座源于西方国家,随着社会的发展和国与国之间的联系越来越频繁,才将星座引入中国。由于星座来源于西方,而阴历只是中国特有算法,所以星座按照阳历日期计算。 古巴比伦人对这些星座进行了长期预测,通过观测定出了黄道,又把黄道分成12等分,成了“黄道十二宫”。这十二https://www.jieqinwang.com/baike/48932.html
10.中国农历发展简史中国农历发展简史 农历,指的是我国的传统历法,又称旧历,夏历.与古巴比伦历,古印度历,犹太历等 历法一样,中国农历属于阴阳合历,即同时兼顾朔望月周期和回归年周期,使每个月符合月 亮盈亏变化,每一年符合春夏秋冬的变化.除此以外,二十四节气和干支纪法也是中国农历 的重要元素和特征.我国自先秦至清末,正式的历法https://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fsci.faq%2FAstronomy%2Fbw%2Fall2%2Fbk37k%2FM.1275291864.z0&ap=353
11.中国农历(阴历)与阳历(公历)转换与查询工具·majiameng/tools@*字符串加密解密算法 *2.1 HTTP请求工具类 *2.2 中英文装换工具类 *2.3 字符串加密解密算法 *2.4 异步执行 *2.5:date:中国农历(阴历)与阳历(公历)转换与查询工具 *文件日志读写 *字符串处理 *递归数组处理 ###2.1.HttpRequest Class >Use curl implementation request,Support uploading pictures and custom heahttps://github.com/majiameng/tools/commit/abe994405a4cc035da4212c471a8b39362a65613
12.农历计算方法探秘(农历如何计算)农历,又称阴历或农事历,是中国传统历法之一。它以月亮的阴晴圆缺为基础,结合太阳的运行规律来安排时间。农历的计算方法较为复杂,主要包括以下几个方面: 1.朔望月的计算:农历以朔望月为单位,一个朔望月是指月亮从朔(月相为新月)到下一个朔的时间。平均而言,一个朔望月的长度约为29.5天。为了使农历年与回归年保https://www.zaixianjisuan.com/jisuanzixun/nonglijisuanfangfatanmi.html
13.老黄历,看男女新算法,这样测男女准确率达92%现在我们常说的“阳历”来自于古罗马,中国自民国元年才开始使用,在清朝及之前都是使用“农历”(也叫阴历)。因此想要看懂2019生男生女清宫图,就一定要使用农历计算。 举例说明:备孕准妈妈小A虚岁28岁,那么她在2014年的农历1、3、7、8、9、10月份受孕,生男孩的可能性比较大,而在剩下的2、4、5、6、11、12月份https://www.snsnb.com/post-145308-1.html
14.python中国农历算法python公历转农历python中国农历算法 python公历转农历 一般使用的万年历,只提供距今前后百年的日历。这是因为其所用的计算方法是一种简便的近似计算,适用范围较小。其次,天文学方法计算量大,不适合日常软件使用。但如果要进行历史研究,范围就超出常用日历,本文即实现计算任意日期的农历。https://blog.51cto.com/u_16099335/8948179