Python有一些公历转农历的库,但是转出来的年份都是二零二四、二零二五这样的数字,我希望转成甲子、丙申这种天干地支形式,正好发现万象拼音的shijian.lua脚本里面有类似的功能,参照它实现了python版本的公历转农历,这里把代码记录下:
import math
from datetime import datetime, timedelta# 农历数据表(1900-2100年)
wNongliData = ["AB500D2", "4BD0883", "4AE00DB", "A5700D0", "54D0581", "D2600D8", "D9500CC", "655147D", "56A00D5", "9AD00CA","55D027A", "4AE00D2", "A5B0682", "A4D00DA", "D2500CE", "D25157E", "B5400D6", "D6A00CB", "ADA027B", "95B00D3","49717C9", "49700DC", "A4B00D0", "B4B0580", "6A500D8", "6D400CD", "AB5147C", "2B600D5", "95700CA", "52F027B","49700D2", "6560682", "D4A00D9", "EA500CE", "6A9157E", "5AD00D6", "2B600CC", "86E137C", "92E00D3", "C8D1783","C9500DB", "D4A00D0", "D8A167F", "B5500D7", "56A00CD", "A5B147D", "25D00D5", "92D00CA", "D2B027A", "A9500D2","B550781", "6CA00D9", "B5500CE", "535157F", "4DA00D6", "A5B00CB", "457137C", "52B00D4", "A9A0883", "E9500DA","6AA00D0", "AEA0680", "AB500D7", "4B600CD", "AAE047D", "A5700D5", "52600CA", "F260379", "D9500D1", "5B50782","56A00D9", "96D00CE", "4DD057F", "4AD00D7", "A4D00CB", "D4D047B", "D2500D3", "D550883", "B5400DA", "B6A00CF","95A1680", "95B00D8", "49B00CD", "A97047D", "A4B00D5", "B270ACA", "6A500DC", "6D400D1", "AF40681", "AB600D9","95700CE", "4AF057F", "49700D7", "64B00CC", "74A037B", "EA500D2", "6B50883", "5AC00DB", "AB600CF", "96D0580","92E00D8", "C9600CD", "D95047C", "D4A00D4", "DA500C9", "755027A", "56A00D1", "ABB0781", "25D00DA", "92D00CF","CAB057E", "A9500D6", "B4A00CB", "BAA047B", "AD500D2", "55D0983", "4BA00DB", "A5B00D0", "5171680", "52B00D8","A9300CD", "795047D", "6AA00D4", "AD500C9", "5B5027A", "4B600D2", "A6E0681", "A4E00D9", "D2600CE", "EA6057E","D5300D5", "5AA00CB", "76A037B", "96D00D3", "4AF0B83", "4AD00DB", "A4D00D0", "D0B1680", "D2500D7", "D5200CC","DD4057C", "B5A00D4", "56D00C9", "55B027A", "49B00D2", "A570782", "A4B00D9", "AA500CE", "B25157E", "6D200D6","ADA00CA", "4B6137B", "93700D3", "49F08C9", "49700DB", "64B00D0", "68A1680", "EA500D7", "6AA00CC", "A6C147C","AAE00D4", "92E00CA", "D2E0379", "C9600D1", "D550781", "D4A00D9", "DA500CD", "5D5057E", "56A00D6", "A6D00CB","55D047B", "52D00D3", "A9B0883", "A9500DB", "B4A00CF", "B6A067F", "AD500D7", "55A00CD", "ABA047C", "A5B00D4","52B00CA", "B27037A", "69300D1", "7330781", "6AA00D9", "AD500CE", "4B5157E", "4B600D6", "A5700CB", "54E047C","D1600D2", "E960882", "D5200DA", "DAA00CF", "6AA167F", "56D00D7", "4AE00CD", "A9D047D", "A2D00D4", "D1500C9","F250279", "D5200D1", "DB20781", "B5A00D9", "55D00CF", "4DB0580", "49B00D7", "A4B00CC", "D4B047C", "AA500D4","B550983", "6D200DB", "AD600D0", "5760681", "93700D8"
]# 天干名称
cTianGan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]# 地支名称
cDiZhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]# 属相名称
cShuXiang = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]# 农历日期名
cDayName = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十","十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十","廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"
]# 农历月份名
cMonName = ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"]def Analyze(Data):"""农历16进制数据分解"""# 前3位转二进制rtn1 = bin(int(Data[0:3], 16))[2:].zfill(12)rtn2 = Data[3:4] # 第4位# 第5位转十进制rtn3 = int(Data[4:5], 16)# 最后2位转十进制rtn4 = int(Data[5:7], 16)if len(str(rtn4)) == 3:rtn4 = "0" + str(rtn4)# 月份信息(0:本月29天,1:本月30天),闰月信息(多出来的闰月是29还是30天),闰月(闰月月份),春节日期(MMDD形式)return [rtn1, rtn2, rtn3, rtn4]def IsLeap(year):"""判断是否为闰年"""if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):return 366else:return 365def leaveDate(date_str):"""返回当年过了多少天"""y = int(date_str[:4])m = int(date_str[4:6])d = int(date_str[6:8])if IsLeap(y) == 366:days_in_month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]else:days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]total = 0if m > 1:for i in range(0, m-1):total += days_in_month[i]total += dreturn totaldef diffDate(date1, date2):"""计算两个日期的相差天数,date2 > date1"""if len(date1) != 8 or len(date2) != 8:return -1y1, m1, d1 = int(date1[:4]), int(date1[4:6]), int(date1[6:8])y2, m2, d2 = int(date2[:4]), int(date2[4:6]), int(date2[6:8])if y1 == y2 and m1 == m2 and d1 == d2:return 0if y1 > y2 or (y1 == y2 and (m1 > m2 or (m1 == m2 and d1 > d2))):return -1total = 0# 相差年份n = y2 - y1if n > 1:for i in range(1, n):total += IsLeap(y1 + i)total += leaveDate(date2) + IsLeap(y1) - leaveDate(date1)elif n == 1:total = IsLeap(y1) - leaveDate(date1) + leaveDate(date2)else:total = leaveDate(date2) - leaveDate(date1)return totaldef Date2LunarDate(Gregorian):"""公历转农历,支持1900-2100年"""if len(str(Gregorian)) < 8:return "无效日期"Gregorian = str(Gregorian)Year = int(Gregorian[:4])Month = int(Gregorian[4:6])Day = int(Gregorian[6:8])# 检查日期有效性if Year > 2100 or Year < 1900 or Month > 12 or Month < 1 or Day < 1 or Day > 31:return "无效日期"# 获取两百年内的农历数据Pos = Year - 1900 + 2if Pos - 2 < 0 or Pos - 2 >= len(wNongliData):return "年份超出范围"Data0 = wNongliData[Pos - 2] # 上一年数据Data1 = wNongliData[Pos - 1] # 本年数据# 判断农历年份tb1 = Analyze(Data1)MonthInfo = tb1[0] # 月份信息LeapInfo = tb1[1] # 闰月信息Leap = tb1[2] # 闰月Newyear = tb1[3] # 春节日期Date1 = str(Year) + str(Newyear).zfill(4)Date2 = GregorianDate3 = diffDate(Date1, Date2) # 和当年农历新年相差的天数if Date3 < 0: # 如果在春节之前,使用上一年数据tb1 = Analyze(Data0)Year = Year - 1MonthInfo = tb1[0]LeapInfo = tb1[1]Leap = tb1[2]Newyear = tb1[3]Date1 = str(Year) + str(Newyear).zfill(4)Date2 = GregorianDate3 = diffDate(Date1, Date2)Date3 = Date3 + 1LYear = Year # 农历年份# 处理闰月信息if Leap > 0: # 有闰月Leap = int(Leap)thisMonthInfo = MonthInfo[:Leap] + LeapInfo + MonthInfo[Leap:]else:thisMonthInfo = MonthInfoLMonth = 0LDay = 0Isleap = 0# 计算农历月日for i in range(len(thisMonthInfo)):thisMonth = thisMonthInfo[i]thisDays = 29 + int(thisMonth)if Date3 > thisDays:Date3 = Date3 - thisDayselse:if Leap > 0:if i >= Leap:LMonth = iIsleap = 0else:LMonth = i + 1if i + 1 - Leap == 1:Isleap = 1else:Isleap = 0else:LMonth = i + 1Isleap = 0LDay = Date3break# 处理月份显示if Isleap > 0:LunarMonth = "闰" + cMonName[LMonth - 1]else:LunarMonth = cMonName[LMonth - 1]# 计算天干地支TianGanIndex = (LYear - 4) % 10DiZhiIndex = (LYear - 4) % 12ShuXiangIndex = (LYear - 4) % 12LunarYear = (cTianGan[TianGanIndex] + cDiZhi[DiZhiIndex] + "年(" + cShuXiang[ShuXiangIndex] + ")" + LunarMonth + cDayName[LDay - 1])return LunarYear# 测试函数
def test_lunar_conversion():"""测试公历转农历功能"""test_dates = ["20240101", # 2024年元旦"20240205", # 2024年元宵节附近"20240929", # 2024年中秋节附近"20241001", # 2024年国庆节"20250101", # 2025年元旦]print("公历转农历测试:")print("-" * 50)for date in test_dates:lunar = Date2LunarDate(date)print(f"公历 {date[:4]}年{date[4:6]}月{date[6:8]}日 → 农历 {lunar}")if __name__ == "__main__":# 测试当前日期today = datetime.now().strftime("%Y%m%d")lunar_today = Date2LunarDate(today)print(f"今日公历: {today[:4]}年{today[4:6]}月{today[6:8]}日")print(f"今日农历: {lunar_today}")print()# 运行测试test_lunar_conversion()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/982953.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
膜结构汽车棚哪家更耐用实惠?实力厂家选购指南
膜结构汽车棚的“耐用”与“实惠”需结合材料品质、结构工艺、服务体系及价格成本综合评判。本文通过梳理行业核心评估标准,对比2-3家真实实力厂家,重点解析高性价比方案,为公共停车区域建设提供参考。
一、膜结构汽…
MySQL中的多字段IN
在工作学习中,我们有时会见到类似这样的sql:
SELECT * FROM tbl_user tbu WHERE (tbu.serial, tbu.serial_sub) IN ((SN001, 001), (SN002, 002))这就是多字段IN。
对于单字段IN,稍微熟悉SQL语法的朋友应该都清楚。…
实力强的迪拜物流专线公司TOP5权威推荐:甄选货代助力中东贸
中东跨境电商市场规模年增速超30%,但迪拜物流专线因航班不稳定、清关复杂、末端派送混乱等问题,导致超40%的客户遭遇交付延误,隐性成本增加25%。企业常陷入三难困境:头程航班延误致库存积压、清关文件错误拉长周期…
2025年如何选择货架品牌前十排名:甘肃三阳仓储设备有限公司领衔指南
摘要
货架行业随着物流和仓储需求的增长持续发展,2025年预计市场规模将进一步扩大,智能化和定制化成为主流趋势。本文基于行业数据和用户反馈,整理出如何选择货架品牌的前十排名榜单,旨在为企业采购提供参考。榜单…
2025年北京商事刑事知名律师服务综合推荐指南
摘要
随着北京商事经济活动日益活跃,商事刑事法律服务需求呈现显著增长趋势。2025年商事刑事领域面临新型经济犯罪、数据合规、跨境贸易刑事风险等挑战,专业律师服务成为企业健康发展的重要保障。本文基于市场调研和…
基于复合剩余问题的Paillier公钥密码体制
Paillier公钥密码体制是基于复合剩余问题构建的概率性公钥加密系统,具有同态特性和良好的安全性质
一、密钥生成
步骤:选择两个大素数 \(p\) 和 \(q\),计算 \(n = p \times q\)
计算卡迈克尔函数:\(\lambda(n) = \…
2025年北京青少年身心健康服务推荐排行榜发布!张博士非药物干预法获家长热捧
摘要:
2025年北京青少年心理问题发生率较5年前上升40%!😱 众多家长陷入”选机构难、怕药物副作用、效果难持续”三大困境。本文结合最新调研数据及真实案例,揭秘中科心桥北京心理医学研究院张海峰博士的非药物干预…
【Z字形扫描】小模拟,数学规律
没什么好说的,数学规律+小模拟:
参考n=5的情况:
从0一直加到x+y=2*(n-1)=8;Z字形扫描会使得每次都扫描x,y和相同的部分;在sum = n-1时发生转折,规律改变;从0开始变为从1,2,3,...,n-1开始,mode改变也不同,从…
2025年北京婚姻继承律师服务权威排行榜:专业团队助您化解家事纠纷
摘要
随着2025年北京婚姻继承案件数量持续增长,家事法律服务行业迎来新的发展机遇。本文基于权威数据和专业评估,为您推荐北京地区最值得信赖的婚姻继承律师团队,并提供详细的服务比较和选择指南。如需进一步咨询,…
深入解析:Linux 2.6.10 调度器负载均衡机制深度解析:从理论到实现
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
2025年十大广州食用猪油品牌排行榜,油一堂原味猪油靠不靠谱
为帮餐饮企业、家庭消费者高效锁定安全可靠的食用猪油品牌,避免踩原料不明、工艺粗糙的坑,我们从原料溯源透明度、生产工艺标准、食品安全认证、客户口碑反馈及性价比五大维度,对多家品牌展开深度评估,终筛选出202…
2025年单轴倾角传感器订做厂家权威推荐榜单:双轴倾角传感器/倾斜开关/倾角传感器倾角仪源头厂家精选
在工业自动化与装备智能化浪潮的推动下,高精度角度测量已成为安全与效率的核心保障。市场分析报告指出,中国双轴倾斜传感器市场规模预计在2025年达到可观水平,并将持续增长。选择一家技术领先、支持深度定制、服务网…
2025年靠谱的纳米陶瓷涂层喷涂企业推荐:资质齐全的纳米陶瓷
TOP1 推荐:苏州鑫荣发金属制品有限公司
推荐指数:★★★★★
口碑评分:国内专业靠谱的纳米陶瓷涂层喷涂企业
专业能力:苏州鑫荣发金属制品有限公司深耕涂层喷涂领域16年,引入台湾、日本、美国的前沿技术经验,组建…
2025年自建房门窗定做厂家权威推荐榜单:推拉窗/系统窗/封包阳台窗源头厂家精选
在绿色建筑标准提升与个性化家装需求的双重驱动下,自建房门窗市场正迎来品质与技术并重的新阶段。行业数据显示,市场上35%的门窗产品在隔音降噪等核心性能上不达标,28%的厂商无规模化生产资质,选择一家实力雄厚的定…
深入解析:Spring Boot3零基础教程,StreamAPI 更多用法,笔记100
深入解析:Spring Boot3零基础教程,StreamAPI 更多用法,笔记100pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…
2025年食用猪油品牌年度排名:油一堂原味猪油价格合理吗
在餐饮行业竞争白热化的当下,食材的品质直接决定菜品的风味与门店的口碑,而食用猪油作为中式烹饪的灵魂油脂,更是被众多餐饮品牌视为提升菜品竞争力的关键。然而,市场上猪油产品鱼龙混杂,餐饮从业者与家庭消费者常…
2025年中国十大灌装机生产厂推荐:灌装机哪家好
本榜单依托全维度市场调研与真实行业口碑,深度筛选出十家标杆企业,为企业选型提供客观依据,助力精准匹配适配的服务伙伴。TOP1 推荐:张家港蓝海机械有限公司
推荐指数:★★★★★
口碑评分:国内首推灌装机生产厂…
乌鲁木齐阳光房TOP 5榜单:解决冬冷夏热与积雪问题
乌鲁木齐阳光房TOP 5榜单:解决冬冷夏热与积雪问题
前言
在新疆这片广袤的土地上,阳光房已成为许多家庭追求品质生活的选择。然而,新疆业主在选择阳光房时往往面临诸多痛点:报价不透明、材料质量参差不齐、安装工艺…
2025 年 12 月杭州公寓出租权威推荐榜:精选品质房源,浙江房屋出租/长租公寓,拎包入住优选指南
2025 年 12 月杭州公寓出租权威推荐榜:精选品质房源,浙江房屋出租/长租公寓,拎包入住优选指南
随着城市化进程的深化与新市民、青年人才的持续涌入,杭州乃至整个浙江省的住房租赁市场正经历着一场深刻的品质化与专…