当前位置: 首页 > 后端技术 > Python

Python处理生肖干支、地支、农历等问题

时间:2023-03-25 20:51:23 Python

importtimeimportsxtwlGan=["A","B","C","D","E","Ji","Geng","Xin","Ren","白"]Zhi=["Zi","Chou","Yin","Mao","Chen","Si","Noon","Wei","申","佑","戌","亥"]ShX=["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]jqmc=["冬至","小寒","大寒","立春","雨","惊蛰","春分"、《清明》、《谷雨》、《立夏》、《小蛮》、《芒果》、《夏至》、《小暑》、《大暑》、《立秋》、《暑期》、《白露》、《秋分》、《寒露》、《霜降》、《立冬》、《小雪》“、”t;大雪"]Ymc=('正','一','二','三','四','五','六','七','八','九','十','十一','La')rmc=["第一天","第二天","第三天","第四天","第五天","第六天","第七天","第八天、第九天、第十天、第十一天、十二天、第十三天、第十四天、第十五天、第十六天、第十七天、“十八”、“十九”、“二十”、“二十一”、“二十”-二"、"二十三"、"二十四"、"二十五"、"二十六"、"二十七"、"二十八"、"二十九"、"三十"、"三十一"]XiZ=['摩羯座','水瓶座','双鱼座','白羊座','金牛座','双子座','巨蟹座','狮子座','处女座','天秤座','天蝎座','射手座']WeekCn="123456"defgetTime():d=time.localtime()returnf'{d.tm_hour}点{d.tm_min}分{d.tm_sec}秒'defgetDate():d=time.localtime()returnf'{d.tm_year}年{d.tm_mon}月{d.tm_mday}日,week{WeekCn[d.tm_wday]},day{d.tm_yday}'defget_jieqi_time(day):#那天有没有节气ifday.hasJieQi():#获取节气的儒略日jd=day.getJieQiJD()#将儒略日转换为年月日时秒t=sxtwl.JD2DD(jd)#注意t.s是小数,需要四舍五入tt="moment:%d:%d:%d"%(t.h,t.m,round(t.s))returnf'today{jqmc[day.getJieQi()]},{tt}'else:foriinrange(2,32):day=day.before(1)ifday.hasJieQi():jq=jqmc[day.getJieQi()]returnf'{jq}th{i}day'defget_lunar_month_days(day):#农历月日数year=day.getLunarYear(False)month=day.getLunarMonth()isRun=Trueifday.isLunarLeap()elseFalsedaynum=sxtwl.getLunarMonthNum(year,month,isRun)r='small'ifdaynum<30else'Big'return'%s%smonth%s'%("leap"ifisRunelse"",Ymc[day.getLunarMonth()],r)defget_lunar_date(day):#农历以春季开始为界的日历s="%s%smonth%s"%(#day.getLunarYear(False),'leap'ifday.isLunarLeap()else'',Ymc[day.getLunarMonth()],rmc[day.getLunarDay()-1])#s=s+'\nToday's%s%s'%(jqmc[day.getJieQi()],tt)returnsdefget_gz(day,tm):#以立春为界的天干地支(注意,如果没有参数都是pass,或者false,立春正好和getLunarYear相反)yTG=day.getYearGZ()#干支年ygz=Gan[yTG.tg]+Zhi[yTG.dz]shx="生肖:"+ShX[yTG.dz]#月干支mTG=day.getMonthGZ()mgz=Gan[mTG.tg]+Zhi[mTG.dz]#日干支dTG=day.getDayGZ()dgz=Gan[dTG.tg]+Zhi[dTG.dz]#时干支,24小时打发时间,分为早晚时间hour=tm.tm_hoursTG=day.getHourGZ(hour)sgz=Gan[sTG.tg]+Zhi[sTG.dz]返回f'{ygz}年,{mgz}月,{dgz}日,{sgz}时。\n{shx}'defget_jieqi_before(day):whileTrue:day=day.before(1)#hasJieQi接口比getJieQiJD更快,也可以用getJieQiJD判断是否有节气。ifday.hasJieQi():jq=jqmc[day.getJieQi()]jqDay='农历'+get_lunar_date(day)returnf'{day.getSolarMonth()}month{day.getSolarDay()}day{jq},{jqDay}'defget_jieqi_after(day):whileTrue:day=day.after(1)ifday.hasJieQi():jq=jqmc[day.getJieQi()]jqDay='农历'+get_lunar_date(day)返回f'{day.getSolarMonth()}month{day.getSolarDay()}day{jq},{jqDay}''''1。获取某天的前几天或者后几天的信息(很多场景都可以用到)#获取某天的后几天num=1#想写多少天都行,还有可以写负数,相当于往前走),day.getSolarMonth(),day.getSolarDay())print(s)#同上day=day.before(num)s="公历:%dYear%dMonth%dDay"%(day.getSolarYear(),day.getSolarMonth(),day.getSolarDay())print(s)1.获取当年的闰月#获取当年的闰月year=2020month=sxtwl.getRunMonth(year)ifmonth>=0:print("%d年的闰月是%d"%(year,month))else:print("没有闰月")1.获取农历月份的天数#农历的天数月ear=2020#Lunaryearmonth=4#LunarmonthisRun=False#是闰月吗?daynum=sxtwl.getLunarMonthNum(year,month,isRun)print("阴历%d年%s%d月的天数:"%(year,'leap'ifisRunelse'',month),daynum)1.公历与公历相互转换#公历转公历jd=sxtwl.J2000t=sxtwl.JD2DD(jd)#公历转公历jd=sxtwl.toJD(t)1.查找某天前后的节气#查找某天前后的节气,本例为after,把after换成beforewhileTrue:#这里可以用after或before,不用担心速度问题,这里的计算很简单,底层+1day=day.after(1)#hasJieQi接口比getJieQiJD更快,也可以用getJieQiJD判断是否有节气ifday.hasJieQi():print('solarterms:%s'%jqmc[day.getJieQi()])#获取节气的儒略日数,如果要计算任意时间之间的距离,比比较儒略日更方便直接点,相信我。jd=day.getJieQiJD()#将儒略日转换成年月日时秒t=sxtwl.JD2DD(jd)#注意t.s是小数,需要四舍五入print("节气时间:%d-%d-%d%d:%d:%d"%(t.Y,t.M,t.D,t.h,t.m,round(t.s)))break1。四栏反查(好像还是有bug,待修复)#四栏反查工具方法#实际项目不要这样,因为汉字utf-8和GBK2312编码不同。建议直接使用天干地支的数字索引defgetGZ(gzStr):tg=-1dz=-1fori,vinenumerate(Gan):ifgzStr[0]==v:tg=ibreakfori,vinenumerate(Zhi):ifgzStr[1]==v:dz=ibreakreturnsxtwl.GZ(tg,dz)#四个音符逆向校验分别通过年月日和小时,开始查询年份,结束查询返回满足条件的儒略日数jds=sxtwl.siZhu2Year(getGZ('新丑'),getGZ('继海'),getGZ('丙寅'),getGZ('百巴'),2003,2029);forjdinjds:t=sxtwl.JD2DD(jd)print("符合条件的时间:%d-%d-%d%d:%d:%d"%(t.Y,t.M,t.D,t.h,t.m,round(t.s)))'''defmakeDay():tm=time.localtime()#返回的是一个命名元组#从公历中获取一天的信息day=sxtwl.fromSolar(tm.tm_year,tm.tm_mon,tm.tm_mday)#从农历年月日获取一天的信息#day=sxtwl.fromLunar(2020,12,1)returnday,tmdefgetLunarDate():day,tm=makeDay()return'.\n'.join((get_lunar_date(day),get_lunar_month_days(day),get_gz(day,tm)))defgetJieQi():day,tm=makeDay()return'.\n'.join((get_jieqi_time(day),get_jieqi_before(day),get_jieqi_after(day)))defget_constellation():#fix(bug?discovered)day,tm=makeDay()returnXiZ[day.getConstellation()复制代码]+'恩'