求剧情
算法的乐趣 · 第三十五节

《算法的乐趣》第三十五节

公历与农历周期长度不同,二者没有固定的对应关系,无法用公式直接转换,只能按历法规则推算。

公历与农历周期长度不同,二者没有固定的对应关系,无法用公式直接转换,只能按历法规则推算。由于上一个公历年的冬至所在的朔望月是上一农历年的十一月,因此需计算包含上年冬至在内的二十五个节气,以及从上年冬至前第一个朔日起连续十五个朔日,才能覆盖两个冬至之间的完整周期。

根据这些朔日建立朔望月与公历日期的对应表:相邻朔日间隔决定当月天数(29天为小月,30天为大月),含冬至的朔望月定为十一月,其余依此类推。输出双历时,逐日判断其所属朔望月确定月名,再计算该日与朔日相差的天数得到农历日期。具体实现中,GetAllSolarTermsJD()计算节气,GetNewMoonJDs()计算朔日,BuildAllChnMonthInfo()生成各月信息,CalcLeapChnMonth()判断是否置闰:若第十四朔日早于第二个冬至,说明有十三个月,需找出未含中气的月份设为闰月,并将其后各月月名减一。

最后结合天干地支与生肖信息,即可显示出完整的公农历双历年历。本节总结指出,农历与公历都是人为定义的计时单位,各有取舍,并无绝对准确可言;现代天文算法使历法计算变得简便,牛顿迭代法等在节气与朔日计算中发挥了作用。

‹ 上一章目录下一章 ›

全部 76 章