在介绍农历之前,要先说明什么是历法《历法》来自百度百科农历以朔望月为基础,以太阳年【二十四节气】为辅助矫正,从而实现日期推算和置闰法则。
《朔望月》来自百度百科1.大小月规则 每一个朔望月平均持续29.53059天,每当小数部分补足一个整数1,那么这个月为大月。年长度根据年内月份而确定,一般为353-355天,闰年为383-385天。
二十四节气,每一个节气持续15天,总共持续360天,当与月份天数和相差一个月时,此时置闰。农历课拆分为太阳历【二十四节气】和太阴历【朔望月】1.太阴历部分置闰规则比如2023年,基于朔望月的年此时为355+355+355天(相比较于地球年365.2422*3天少了30.6天),所以此时为闰年,但还不能确定哪一个月是闰月。3.太阳历部分置闰规则二十四节气,表面上为物候,实则为太阳历,将一年360天划分为24个月,每月15天,取其中第一个只有中气的月份为闰月。以下是紫金山天文台对农历历法的规则限定
如果有感兴趣,想实现农历编程的朋友,可以联系我,但我不喜欢五分钟热度,我已经研究这个课题半年多了[阴险]以下是使用Excel进行日期计算得到的初步结果。
目前的程序设计思路为2023年8月21日【西洋年】为4721年7月初六【农历年】以公园前-2698年的春节【西洋年】为1年正月初一【农历年】1.在Excel上进行数据模拟,初步得到日,月,年之间的函数关系,以及天干地支。(已实现)2.使用c++,java进行程序设计,设计思路如下(以c++代码为例,暂时不考虑语法错误)/*** 时间单位*/enum TemporalUnit{ /** * 天 */ DAY, /** * 年号,比如贞观年。 */ ERA, // 西洋时 HOUR, // 西洋毫秒 MILLIS, // 西洋分钟 MINUTE, /** * 月 */ MONTH, // 西洋秒 SECOND, /** * 这里的scale称之为刻,比如午时三刻,一刻为15分钟。 */ SCALE, /** * 星期 */ WEEK, /** * 年 */ YEAR, /** * 这里的zodiac表示为时辰,比如卯时,一个时辰为2小时。 */ ZODIAC;}/*** 时间域*/enum TemporalField{ /** * 在当前月中的序数,比如正月第一天。 */ DAY_OF_MONTH, /** * 在当前年中的序数,比如癸卯年第六天。 */ DAY_OF_YEAR, /** * 在当前周中的序数,比如星期五。 */ DAY_OF_WEEK, /** * 以1970年1月1日为标准,所表示的相差天数。比如7,就是1970年1月8日。 */ EPOCH_DAY, /** * 以1970年1月1日1时1分1秒1毫秒为标准,所表示的相差秒数。比如7,就是1970年1月1日第8秒。 */ EPOCH_SECOND, /** * 年号 */ ERA, /** * 递推日,表示从历法1年1月1日到当前的天数,比如7日为1年1月8日。 */ PROLEPTIC_DAY, /** * 递推月,表示从历法1年1月到当前的月数,比如4月为1年5月。 */ PROLEPTIC_MONTH, /** * 递推年 表示从历法1年到当前的年数,比如4721年,2023年。 */ PROLEPTIC_YEAR;}/*** 负责日期加减,调整,核验的类*/class Temporal{}class Day : public Temporal{}class Month : public Temporal{}class DayOfMonth : public Temporal{}class Year : public Temporal{}class DayOfYear : public Day, Year{}class MonthOfYear : public Month, Year{}/*** 时区类*/class Timezone;/*** 时钟类*/class Clock;/*** 初始为1年1月1日,使用Year, Month, Day调整日期*/class ChineseDate : public Temporal{ }class ChineseDateTime : public Temporal{}更多算法细节就不透露了,目前最重要的是研究天体运行对地球的影响,需要学习的知识还有很多。如果有兴趣加入,可以联系我。
【原创】农历算法原理
释放双眼,带上耳机,听听看~!