将公历换成干支历,可以遵循以下步骤:
计算天干 :
用公历年份数减去3,再除以10,所得的余数即为天干所对应的位数2。例如,2025年减去3得到2022,2022除以10余2,对应的天干是壬1。
计算地支 :
用公历年份数减去3,再除以12,所得的余数即为地支所对应的位数2。例如,2025年减去3得到2022,2022除以12余2,对应的地支是丑1。
组合天干地支 :
将计算出的天干和地支组合起来,即为该年的干支纪年2。例如,2025年的干支纪年是壬寅年2。
注意事项:
干支纪年的计算是以每年的立春为分界点,立春之前为前一年的干支,立春之后为当年的干支。
如果需要将公历日期转换为干支日柱,还需要考虑月份和日期的具体计算。
月份的转换先求出(年份数-4)÷5的余数,再用余数x12+月份数,这个数的个位数(实际上是这个数除以10的余数)对应天干,月份数对应地支。这是这个月开始几天对应的干支月。转换月份时要注意以每个月上旬的节气(立春,惊蛰,清明,立夏,芒种,小暑,立秋,白露,寒露,立冬,大雪,小寒)为分界点,过了这一天,干支应向后推1。如将2019年1月转换为干支月:(2019-4)÷5余数为0,0x12+1=1,天干、地支都是1,对应甲子月,这个月的5日是小寒,所以过了小寒这个月为乙丑月。(一般,上半年的节气在4~6日,下半年的节气在7~8日)又如将2020年4月转换为干支月:(2020-4)÷5余1,1x12+4=16;6对应天干己;4对应地支卯,为己卯月。这个月的4月4日为清明,所以过了清明这个月为庚辰月。
三、日期的转换由于日期转换涉及到年月日,计算量较大,可以以一个特定日,如以2020年1月1日(癸卯对应40)为基准推算。将(超过的天数+40)÷60的余数的个位数字对应天干,再将(余数-12倍数)所得差对应地支。如2020年1月25日(春节)。超过了25-1=24(天);24+40=64;64-60=4。
4对应(天干)丁;4对应(地支)卯,为丁卯日。又如2020年4月4日(清明)。超过了(31-1)+29+3+4=94,94+40=134,134-60x2=14;4对应(天干)丁,14-12=2;2对应(地支)丑。为丁丑日。
2019年12月7日(大雪),往前推1+(31-7)=25(天),转换为超过了60-25=35(天);35+40=75-60=15;5对应(天干)戊,15-12=3;3对应(地支)寅。为戊寅日。
四、时辰的转换(23时~1时)为子时;(1时~3时)为丑时;(3时~5时)为寅时;(5时~7时)为卯时;(7时~9时)为辰时;(9时~11时) 为巳时;(11时~13时)为午时;(13时~15时)为未时;(15时~17时) 为申时;(17时~19时)为酉时;(19时~21时)为戌时;(21时~23时) 为亥时。地支也可以用下面的方法计算:(时+3)÷2的整数部分。如:
1、时。(1+3)÷2=2;2对应丑。
2时。(2+3)÷2=2.5;2对丑。
3时。(3+3)÷2=3;3对应寅。……23时。(23+3)÷2=13,13-12=1,1对应子。求天干可以按下面的方法进行因为一天有12个时辰;60÷12=5,所以5天为一个周期。若以2020年1月1日0时为基准,将超过的天数除以5求出其余数,则天干对应的数为:余数x12+8+地支对应的数的和的个位数。如2020年1月1日7时。地支(7+3)÷2=5;5对应辰。0x12+8+5=13;3对应丙。为丙辰。又如2020年1月25日0时。地支(0+3)÷2=1.5,1对应子。(25-1)÷5余4;4x12+8+1=57;7对应庚。为庚子。又如2019年12月25日9时。地支(9+3)÷2=6;6对应巳。这个日期在基准前(1+31-25=)7天;5x2-7=3;3x12+8+6=50,0(10)对应癸,为癸巳。此转换方法比较简明实用。但这只是一管之见,现公之于众,仅提供一种实践中切实有用的方法和思路,且求教于师友和专家。
pip install chinese_lunar
from chinese_lunar import solar_to_lunar
def convert_to_lunar(year, month, day):
lunar_year, lunar_month, lunar_day = solar_to_lunar(year, month, day)
lunar_date = f"{lunar_year}-{lunar_month}-{lunar_day}"
lunar_day_chinese = solar_to_lunar.lunar(year=lunar_year, month=lunar_month, day=lunar_day).day_chinese
return lunar_date, lunar_day_chinese
# 示例使用
year = 2023
month = 3
day = 18
lunar_date, lunar_day_chinese = convert_to_lunar(year, month, day)
print(f"公历日期: {year}-{month}-{day}")
print(f"干支历: {lunar_date}, {lunar_day_chinese}")