阳历转化成农历算法
阴历阳历转换计算公式
1、阳历日期推算阴历日期的方法:前已述及阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
如要知道1984年6月8日是阴历几日?可以利用公式推算阴历日期:设:公元年数-1977(或1901)=4Q+R则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n(注:式中Q、R、n均为自然数,R<4)例:1994年5月7日的阴历日期为:1994-1977=17=4×4+1故:Q=4,R=1 则:5月7日的阴历日期为:14×4+10.6(1+1)+(31+28+31+31+7)-29.5n=204.2- 29.5n然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日2.公历换算为农历二十四节气在黄道上的位置是固定的,但各年有平年和闰年之分,就使得回归年天数与实际天数不等,每年在日历上可差一天。
这样可以将阴历经过任意整回归年在现在的日历上查到阳历(阳历一年相当阴历的月数为365.2422/29.530588=12.36827个月)。
例如,可先在1995年的日历上查得与(该年)阴历对应的阳历日期,这样就找到了临时落脚点,也就是找到了阴阳互换的关键。
例如,可先以阴历四月初一(日)为引数,在1995年日历上查到对应的阳历为4月30日。
由于已经计算出经过的月数,将经过的月数的尾数(小数)化为日,加在4月30日上,就得到经过(1995-1070)整年数的阳历日期,也就是起始阴历日期对应的阳历日期,即得到了待查的日期为4月30日加上0.64957×29.530588得到(1070年)5月19.1821840日。
这样就得到了所给例子的阴阳历日期换算结果……”。
0.64957月的由来,(1995-1070)×12.36827=11440.64957月已知依泽公生于梁龙德二年(922)六月二十一日,依下表提供的2099年各月初一日的公历月日数,可以算出龙德二年六月二十一日的公历月日数公元2099年农历各月初一日的公历月日(2099-922)×12.36827=1455.45379月余数为0.45379月×29.530588日=13.4O日因2099年五月初一日(包括该年闯二月)在公历6月19日,加上计算所得的13日为龙德二年六月初一日的公历月日,即该年7月2日,则该年农历六月二十一日为该年7月22日。
【公历年份换算农历干支纪年口诀】(含公元前后两种换算方法公式)简单、实用、易学、好记
【公历年份换算农历干支纪年口诀】(含公元前后两种换算方法公式)简单、实用、易学、好记【公历年份换算农历干支纪年口诀】干支纪年法是中国历法上自古以来就一直使用的纪年方法,采用的是阴阳合历。
干支是天干和地支的总称。
把干支顺序相配正好六十为一周,周而复始,循环记录,这就是俗称的“干支表”。
干支纪年以每年春节换年。
而在历史教学中记录一些事件的发生时间都是采用公元纪年,公元纪年和干支纪年有一个简单的换算口诀如下:一,用数字对应天干地支:自然数: 1 2 3 4 5 6 7 8 9 0天干:甲乙丙丁戊己庚辛壬癸自然数: 1 2 3 4 5 6 7 8 9 10 11 0地支:子丑寅卯辰巳午未申酉戌亥二,举例(以2018为例):公元年数减去3——2018-3=201510除余數是天干——2015÷10=201……5(戊)该数再用12除——2015÷12=167……11(戌)余数就把地支显所以2018年按干支纪年就是戊戌年。
以上是公历公元年份换算成农历干支纪年的计算方法。
下面姜毅同志研究发现了另一段年份的换算方法,即:公历公元前年份换算成农历干支纪年的计算方法:一,用數字對應天干地支:0 9 8 7 6 5 4 3 2 1天干:甲乙丙丁戊己庚辛壬癸0 1110 9 8 7 6 5 4 3 2 1地支:子丑寅卯辰巳午未申酉戍亥二,口訣並舉例(以公元前57年為例):公元前年數加3:57+3=601.60除10的余數是天干:60÷10=6……0(0对应的天干是甲);还有一种更简单明了的方法,就是年数加3后的和不用作除10计算,直接用和的个位数与天干对应即可。
2.60除12的余数是地支:60÷12=5……0(0对应的地支是子)余数就把地支显所以公元前57年换算成农历干支纪年就是甲子年。
又如:将公元前1250年换算成干支年:1250+3=1253① 和的个位3对应的天干为辛②1253÷12=104 (5)余数5对应的地支为未故公元前1250年为辛未年。
农历阴历转换
农历阴历转换
阴历转换是一种将阳历(按照公历中使用的格里高利历)转换为风俗习惯上使
用的阴历的过程。
阴历转换起源于中国,其它东亚国家也采用阴历作为其官方历法,比如朝鲜、日本和越南。
那么如何将阳历日期转换为阴历日期呢?其实很简单,只需要以下几步即可完成:
一、计算阴历新月日期
1.确定阴历新月日期。
根据中国传统历法,每一个月开始时均会有新月,即朔月。
2.从公元元年(即2012年)开始,每28个星期(即四个月),朔月日期会被
重置为一样。
3.根据需要查找要转换的阳历日期在该时期内的位置,找出其朔月日期。
二、计算阴历闰月
1.在计算月份时,也要考虑到闰月的存在,因为每个月的长度也会因此而有所
不同。
2.要想知道一个月是否为闰月,需要从公元元年起,根据查找其每19年的太
阳月历中有多少闰月,以确定是否当前月份为闰月。
三、计算阴历日期
1.在确定当前月份是否为闰月后,就可以根据阴历月份长度计算当前日期应该
位于哪个月份,并且确定当前日期所在月份的具体日期。
2.最后再将当前月份加上朔月日期,即可得出最终的阴历日期。
以上就是阴历转换的一般步骤,大家可以根据以上步骤轻松将阳历日期转换为
阴历日期。
此外,如果大家有兴趣,也可以在电脑上安装一些适合的软件,专门用于阴历转换。
公历转农历方法
初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。
其二可以利用公式推算阴历日期:设:公元年数-1977(或1901)=4q+r则:阴历日期=14q+10.6(r+1)+年内日期序数-29.5n(注:式中q、r、n均为自然数,r<4)例:1994年5月7日的阴历日期为:1994-1977=17=4×4+1故:q=4,r=1 则:5月7日的阴历日期为:14×4+10.6(1+1)+(31+28+31+31+7)-29.5n=204.2- 29.5n然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。
蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。
蔡勒公式如下:W = [ C/4 ] - 2C + y + [ y/4 ] + [ 13 * (M + 1) / 5] + d -1公式中的符号含义如下:W: 星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六C: 世纪-1(前两位数)y: 年(后两位数)m: 月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)d: 日[ ]代表取整,即只要整数部分。
下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1=49+[12.25]+5-40+[28.6]=49+12+5-40+28=54 (除以7余5)即2049年10月1日(100周年国庆)是星期五。
公历农历转换方法
公历农历转换方法公历和农历是不同地区和文化中所采用的两种历法。
公历是以太阳历为基础,以地球绕太阳一周的时间为计量单位。
而农历则是以月相为基础,采用太阳和月球的运行周期来计算时间。
1.确定公历日期和年份。
首先,需要知道要进行转换的公历日期和年份。
公历日期包括月份、日期和年份。
2.确定公历年份是否为闰年。
公历闰年是指在二月份增加一天的年份。
闰年规则是,能被4整除但不能被100整除的年份是闰年,但能被400整除的年份也是闰年。
3.确定公历日期在一年中的天数。
需要计算从当年的一月一日到所给定日期的天数。
例如,5月1日在一年中的第121天。
4.确定农历年份。
农历年份按照十二属相的循环进行命名,例如鼠年、牛年等。
农历年份通常比公历年份小,所以需要找到所给定日期对应的农历年份。
5.确定农历闰月。
农历年份中的一些月份可能是闰月,即在正常的十二个月之外增加的一个月。
农历闰月的规则比较复杂,通常需要使用农历年历表格或专门的工具进行查询。
6.确定农历月份和日期。
一旦确定了农历年份和闰月,就可以根据公历日期和天数计算出农历日期。
需要根据农历每个月的天数和闰月的位置进行计算,这也可以通过参考农历年历表格来进行查询。
7.规范化农历日期。
农历日期通常以干支纪年的形式表达,需要将计算出的农历日期转换为常见的农历日期格式。
例如,将鼠年转换为1月1日。
这是一种简单的公历农历转换方法,但对于一些复杂的日期,如涉及到闰月的情况,可能需要更高级的技巧和工具来进行精确的转换。
现在,让我们来看一些农历的特点和一些常用的公历农历转换工具。
农历是以月相为基础,一般由十二个或十三个月组成,每个月以朔望月(农历月初)为起点,到下一个朔望月为止。
由于地球绕太阳公转的周期和月球绕地球运行的周期不完全吻合,导致农历年份的长度不固定,平均约为354-355天,比公历年份的365天要短。
在中国,农历仍然广泛用于农民和传统节日的日期计算。
另外,一些东亚国家和社区(如日本、韩国和越南等)也保留了农历作为重要的时间参考。
公历转农历
公历转农历农历,又称阴历,是中国传统文化中使用的一种历法,它的特点是以月为单位,每月的天数不固定,且与公历不同,因此需要进行转换才能确定某一天是农历的哪一天。
农历的起源可以追溯到中国古代,其中最早被发现的农历纪年方法是按照地月十日记录,这种方法可以追溯到公元前2300年左右。
后来,中国古代的天文学家通过对月亮运行轨迹的观测和研究,将农历分为29或30天的十二个月,并规定农历每年的1月1日为新年。
农历的纪年方法与公历不同,农历没有像公历一样的固定的年月日,因此需要使用特定的算法来转换。
公历转农历的方法包括两种:一种是通过查找对应的农历日历表,找到对应的农历日期;另一种是通过计算来求出农历日期。
查找农历日历表的方法是最简单的,但是这种方法并不能满足所有的需求,因为农历日历表通常只能查询到2022年的农历日期。
如果要查询超过2022年的农历日期,就需要使用计算的方法。
计算农历日期的方法是根据农历的规律来计算,主要有以下几个步骤:1.首先计算公历某一天是公元元年的第几天,这个数值称为公历天数。
公元元年1月1日是公历的第一天,每经过一天,公历天数加1。
2.接下来,根据农历的规律,计算公历天数对应的农历年份。
农历每年的1月1日都是春节,因此可以通过计算春节的公历日期来确定农历年份。
3.计算农历月份。
农历每月的天数不固定,需要根据农历年份的特点来确定。
4.最后,计算农历日。
根据剩余的公历天数,即可得到农历日。
公历转农历是一个复杂的过程,需要综合考虑许多因素,因此有时候可能需要使用专业的软件来帮助计算。
不过,对于一般的日常使用,可以使用网上的在线工具或者手机应用程序来转换农历日期。
总的来说,公历转农历是一个复杂的过程,但是对于许多中国人来说,农历又是非常重要的一种历法,因此了解如何转换农历日期是很有必要的。
需要注意的是,农历与公历的转换并不是一成不变的,原因是农历是阳历的一个逼近,所以农历与阳历之间存在一定的时差。
一招教会你公历换算成农历,要不要试试看
一招教会你公历换算成农历,要不要试试看古代的历法是干支纪年,俗称农历或阴历,现在我们都统一采用公历的阿拉伯数字纪年。
因此,就存在着一个历法的换算问题。
当然,我们可以查历书就直接知道了,但是这个方法并不一定方便。
现在告诉大家一个简单的口诀,大家根据这个口诀,再进行简单的推算,就能很快地将公历的数字年,换算成阴历的干支年。
在干支纪年中,由于天干是十位,刚好是十进制,因此,每十年的相应位上,天干都是相同的,比如1980年、1970年、1960年的天干都是庚,而1981年、1971年、1961年的天干都是辛,以此类推,我们只要记住从1至10位的不同天干就行了,不必再做什么推算。
要推算的是地支,地支是十二位,不是十进制,比较麻烦。
但我们只要记住每个0位年的地支,还是可以方便的推算出每一年的地支。
我们现在暂从本世纪的1900年为始,1900年到现在已经86年了,我们所看到的病号大概都在这个范围以内,只有极少数的超过这个范围。
现在需要记忆一个0位年上的地支次第口诀,就是子戌申午辰寅。
1900年,它的地支是子,天干为庚,即庚子年,1910年,它的地支是戌,天干一样还是庚,即庚戌年,依次1920年为庚申年,1930年为庚午年,1940年为庚辰年,1950年为庚寅年。
寅以后,上述的口诀再重新开始,即1960年又为庚子年,1970年为庚戌年,1980年为庚申年,1990年为庚午年,以此类推,无有穷尽。
知道了每个0位年的地支,就可以从相近的两个0位年推出尾数为1、2、3、4、5、6、7、8、9这些年的地支。
我们任举一年,1954年的干支是什么?先定天干,我们已经知道0位数的天干是庚,那么,依次而推,1是辛、2是壬、3是癸、4是甲、5是乙、6是丙、7是丁、8是戊、9是己,所以54年的天干是甲。
由上述的口诀,我们已经知道,1950年的地支是寅。
那么,依次而推,1951年是卯、1952年是辰、1953年是巳、1954年是午。
一键转换,公历转农历只要一个公式,超简单
⼀键转换,公历转农历只要⼀个公式,超简单私信回复关键词【学⼀招】,⼀次性 Get 学⼀招合集!助你成为⾼效职场⼈!
分不清「公历」和「农历」的烦恼⽆处不在。
⽐如从⼩只过「公历」⽣⽇的⼩ E,⾝边有⼀⼤群只过「农历」⽣⽇的朋友。
每次⼩ E 都要翻
N 遍黄历,以确保不在错误的时间送上祝福。
还有过年放假,家⾥⼈总说「初三去⼤姨那⼉拜年,初四去⼤姑家」。
⼩E只能看着台历,从⼤
年三⼗数到正⽉初三。
再⽐如⼀直认为农历七⼣指的是 7 ⽉ 7 ⽇。
……
如果你也有类似的烦恼,那么今天要学的这⼀招,⼀定能帮上你——⽤ Excel 将公历转农历!
公历转农历只需要⼀个简单的公式:
=TEXT(A2,'[$-130000]yyyy-m-d')
其中,A2 表⽰要转化的公历⽇期;
yyyy-m-d 表⽰输⼊⽇期的格式;
[$-130000] 是表⽰公历转阴历的特殊参数。
操作⽅法:
❶先点选单元格,输⼊上述公式:
❷输⼊完公式后,只要按下【回车】键,再双击单元格右下⾓的「填充柄」,快速填充,对应
的农历⽇期就全部转换完成!
例如:今天是公历 2019/7/3,那么对应的农历⽇期就为 2019-6-1:
美中不⾜的是,该公式只适⽤于 Excel 2010 以上的版本,且⽆法计算出闰⽉。
公历转农历方法范文
公历转农历方法范文公历转农历是一种常见的时间转换方法,可以将公历日期转换为农历日期。
农历是中国传统的历法体系,以月亮的运行周期为基础,因此每年的农历日期与公历日期会有一定的差异。
下面是一个关于公历转农历方法的范文,供参考。
一、确定公历日期要进行公历转农历,首先需要明确要转换的公历日期。
公历日期包括年、月、日三个部分。
年份可以直接获取当前年份,月份和日期可以通过系统时间函数获取或用户手动输入。
二、确定农历年份农历年份是根据公历年份来决定的。
根据中国传统的纪年方式,通过环节公元年数来确定农历年份。
例如,2024年是阳历年,对应的农历年份是辛丑年。
确定农历年份的方法可以通过查找相应的农历年份表格或使用算法进行计算。
三、确定农历月份确定农历月份需要知道公历月份和日期。
农历月份通常采用十二个动物名称表示,如子、丑、寅、卯等。
根据农历每个月的特定规律,在已知农历年份的情况下,可以通过查找相应的农历月份表格或使用算法进行计算。
四、确定农历日期确定农历日期需要知道公历月份和日期。
农历日期通常是用天干和地支的组合表示,如甲子、乙丑、丙寅等。
在已知农历年份和农历月份的情况下,可以通过查找相应的农历日期表格或使用算法进行计算。
五、转换结果展示将确定的农历年份、农历月份和农历日期展示给用户。
可以使用控制台输出,也可以通过图形化界面展示。
转换结果还可以包括一些农历节日和节气,如春节、清明节、冬至等。
农历日期的转换方法有多种,可以根据实际需求选择适合的方式。
传统上,人们常使用农历年历来进行日期转换,可以根据公历日期查找对应的农历日期。
现代技术的发展,使得通过计算机程序来进行公历转农历更为方便快捷。
总结公历转农历是一种常见的时间转换方法,可以将公历日期转换为农历日期。
转换过程中需要确定公历日期、农历年份、农历月份和农历日期,再将结果展示给用户。
农历日期的转换方法可以有多种选择,可根据实际需求采取相应的方式。
通过计算机程序来进行公历转农历可以更加方便快捷。
阴历阳历转换算法
阴历阳历转换算法一、阳历转农历算法阳历转农历的算法可以分为两种:数学计算法和查表法。
1.数学计算法阳历转农历的数学计算法基于一些数学公式和推算规则。
其中,公历年份、月份和日期的确定使用了基于蔡勒公式、游戏二法和公式等方式。
核心计算公式:(1)蔡勒公式:W=(C/4-2*C+y+y/4+13*(m+1)/5+d-1)%7其中,W为一周中的日期,C为世纪数,y为年份的后两位数,m为月份(1代表3月,2代表4月,依此类推),d为公历日期。
其中,jdy为公历日期的数值。
M=[N/1461]D = N mod 1461K=[D/365](4)数学计算方法计算公历日期对应的年份、月份和日期。
2.查表法阳历转农历的查表法使用一个双向映射表,将公历日期和农历日期进行映射。
这样,当需要进行阳历转农历时,只需要在该表中查找对应的日期。
该表通常包括每个公历年份的月份和日期,以及相应的农历月份和日期。
二、农历转阳历算法农历转阳历的算法也可以使用数学计算法和查表法。
1.数学计算法农历转阳历的数学计算法基于一定的规则和公式。
其中,农历年份、月份和日期的确定使用了一些数学公式。
核心计算公式:(1)计算春节对应的公历日期:N=y*365+[y/4]-[y/100]+[y/400]+[30.6*(m+0.5)]+d-1899.5其中,N为公历日期的数值。
(2)根据公历日期的数值,计算农历日期的年份、月份和日期。
2.查表法农历转阳历的查表法使用一个双向映射表,将农历日期和公历日期进行映射。
这样,当需要进行农历转阳历时,只需要在该表中查找对应的日期。
该表通常包括每个农历年份的月份和日期,以及相应的公历月份和日期。
三、应用阳历转农历和农历转阳历算法广泛应用于日历、生活工具、节日计算等方面。
在计算机程序和手机应用中,这些算法可以用来进行日期转换、节日提醒等功能。
此外,还有一些相对复杂的算法可以使用天文计算和历法知识,考虑到地球的自转、公转、地球轨道等因素来进行日期转换,提高转换的准确性。
新历生日怎么换算农历生日
1、阴历生日,也就是常说的虚岁生日,计算出来的是虚岁年龄,这是我国传统上常用的年龄计算方法,是按出生后所经历的日历年头计算,即生下来就算1岁,以后每过一次新年便增加1岁。
按阴历生日计算的年龄,一般按农历新年算,也有按公历算的。
这种计算方法是我国民间习惯的一种较为实用的年龄计算方式。
2、而阳历生日,就是指某人出生的那一天,在公元纪年法上的公历日期。
阳历生日计算出来的年龄,即是周岁年龄,又称实足年龄,指从出生到计算时为止,共经历的周年数或生日数。
3、每个人的出生日期,在阴历和阳历中,日期一般是不一样的。
阳历所对应的阴历日子,大约每19年轮回一次。
因此,人们每逢19的倍数生辰的时候,生日当天有可能既是阴历生日,又是阳历生日。
但这种情况出现得少之又少,因为阴历与阳历的准确天数都不是整数,阴历和阳历在19年中的天数也有细微的差别。
经过几十年甚至上百年的积累,当小数变成了整数时,两种历法生日才会完全重合;更多的时候是相差一天。
农历计算【范本模板】
农历的计算方法阳历日期推算阴历日期的方法:阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。
其二可以利用公式推算阴历日期:设:公元年数-1977(或1901)=4Q+R则:阴历日期=14Q+10。
6(R+1)+年内日期序数-29。
5n(注:式中Q、R、n均为自然数,R〈4)例:1994年5月7日的阴历日期为:1994-1977=17=4×4+1故:Q=4,R=1则:5月7日的阴历日期为:14×4+10.6(1+1)+(31+28+31+31+7)—29.5n=204.2—29.5n然后用29.5去除204。
2得商数6...。
.27.2,6即是n值,余数27即是阴历二十七日。
一、推算年干支口诀掌上推算年干支,支子花甲起根源。
阳支都是旬开始,天干为甲尾四年。
隔位逆推十年正,顺推年尾五零三.逐支加减六十数,掌上推算千万年。
推算方法:“掌上推算年干支,支子花甲起根源。
"此法是将地支排列在掌中,手掌上推算年干支的方法。
首先,在掌上将地支定位(图一),然后以地支子位为花甲子的开始,可定为1864,1924,也可定为1984年???,其年都是甲子年.“阳支都是旬开始,天干为甲尾四年。
"地支中的子,寅,辰,午,申,戌都是阳支,而且也是每旬的开始,天干都为甲,即甲子,甲戌,甲申,甲午,甲辰,甲寅,这些年的公历尾数均为四。
“隔位逆推十年正,顺推年尾五零三.”天干十数,地支十二数,天干与地支组合天干每循环一次,地支总与下二支(旬空)。
其中余下的第一支便是下旬的开始。
我们从地支子位开始,隔一位逆推,即从子位逆推隔亥到戌,恰是甲戌旬的开始,再逆推隔一位酉至申为甲申旬开始,—-———-年尾数都为四,年间隔都是十年。
公历到农历的计算公式
公历到农历的计算公式公历和农历是两种不同的历法系统,公历以太阳年为基准,农历以月亮为基准。
在日常生活中,我们常常需要将公历日期转换为农历日期,计算公式可以帮助我们实现这一转换。
公历到农历的计算公式基于以下几个要素:年份、月份和日期。
下面我们将分别介绍如何计算这些要素。
1. 计算农历年份:农历年份的计算是通过与公历年份的差值来确定的。
农历年份与公历年份的对应关系是不固定的,需要参考农历表来确定。
一般来说,公历年份小于1900年时,农历年份与公历年份相差1年;公历年份大于1900年时,农历年份与公历年份相差2年。
2. 计算农历月份:农历月份的计算与农历年份相关。
农历每年有12个或13个月,每个月的天数也不固定。
一般来说,农历年份的第一个月是农历正月,公历1月和2月对应农历正月,以此类推。
但是,如果农历年份有闰月,则闰月的计算需要参考农历表。
闰月是为了保持农历与实际月相的一致性而插入的一个月份。
3. 计算农历日期:农历日期的计算涉及到每个月的天数。
农历每个月的天数不固定,一般为29或30天。
农历日期的计算需要参考农历表,确定每个月的天数。
例如,农历正月的天数是根据农历年份的不同而不同的。
通过以上三个要素的计算,我们就可以将公历日期转换为农历日期了。
下面我们通过一个例子来说明具体的计算过程。
假设我们要将公历2022年5月20日转换为农历日期。
计算农历年份。
根据上面的规则,2022年的农历年份与公历年份相差2年,因此农历年份是2024年。
接下来,计算农历月份。
根据农历表,2024年的闰月是4月,因此5月对应的农历月份是闰三月。
计算农历日期。
根据农历表,闰三月的天数是29天,因此5月20日对应的农历日期是闰三月二十日。
公历2022年5月20日对应的农历日期是2024年闰三月二十日。
通过这样的计算公式,我们可以方便地将公历日期转换为农历日期。
这对于一些需要参考农历的节日、纪念日等场合非常有用。
同时,也可以帮助我们更好地了解农历文化和传统。
公历纪年换算为农历纪年的方法:干支纪年法
公历纪年换算为农历纪年的方法:干支纪年法
干支纪年法,我国传统的纪年方法。
1.干和支的含义:干支是天干,地支的合称。
十大天干:甲乙丙丁戊己庚辛壬癸
十二地支:子(鼠) 丑(牛) 寅(虎)卯(兔)辰(龙)巳(蛇)午(马)未(羊)申(猴)酉(鸡)戌(狗)亥(猪)
2.干和支组合后用于纪年。
即:将十天干和十二地支按顺序搭配组合成干支,用于纪年。
按此排法,可构成60干支(即为一花甲)。
续排下去又将恢复原状,周而复始,永无止尽。
3、计算方法如下:
(1)十大天干编号如下:
甲乙丙丁戊己庚辛壬癸
4 5 6 7 8 9 0 1 2 3
十二地支编号如下:
子丑寅卯辰巳午未申酉戌亥
4 5 6 7 8 9 10 11 0 1 2 3
(2)计算时,天干为:公历年最后一位的数字作为对应的天干编号。
例如:2014年最后一位数是4,,所对应的天干即为:“甲”。
地支为:将公历年数除以12,得到的余数即为对应地支的编号。
例如:2014年除以12,余数为10,所对应的地支为“午”。
将二者合起来就是2014年的干支纪年法的纪年是“甲午”。
再举一例:公元1911年的最后一位数是1,所对应的天干即为:“辛”。
再将1911除以12,余数是3,所对应的地支为“亥”。
二者结合起来:1911年的干支纪年法的纪年是“辛亥”。
所以1911年
推翻满清王朝的革命称为“辛亥革命”。
公历转农历
节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月 天数调整一月农
历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农 历大小月取前一
年的信息农历月从 12 月向前推算 公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元 0 年 1 月 1 日为星期日 只要求得公历日离公元 0 年 1 月 1 日的日子数除 7 后的余数就是星期天为了简化计算采用 月校正法根据公历的
志 F0 0 非闰月 取农历月 天数 Y XYXXY 农历月闰月 农历月加 1 F0 1 F0 取反 是 农历日 X 1 否 农历年月日数 据标准化 子程序出口
-2三程序流程
由于星期的计算很简单这里只提供公历日转农历日的程序流程图
否
是
否
是否
子程序入口
转换数据到 HEX 格式方便运算 根据公历年定位数据表的地址
从数据表中取得春节的公历日期 , 并通过 计算公历日和春节离元旦的天数算出公历
日离春节的天数记为 X 农历年 = 公历年减 1 数据表地址减 3 定位到前一年 取农历月信息 农历月 12 闰月标 志 F0 0 非闰月 XY 否公历日在春节以后码 ? 取农历月天 数Y 是 XXY F0 1 是 否 是 农历月减 1 农历月闰月 F0 取反 是否 农历日 Y X 1 农历年 = 公历年取 农历月信息 农历月 1 闰月标
年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除 7 的余数就是星期 天但如果是在
闰年又不到 3 月份上述之和要减一天再除 7 其 1 12 月的校正数据Байду номын сангаас 6 2 2 5 0 3 5 1 4 6 2 4 在
python实现的阳历转阴历(农历)算法
python实现的阳历转阴历(农历)算法搜索了好⼏个python实现的万年历多有部分时间有问题,好多是来⾃这个代码:复制代码代码如下:#!/usr/bin/env python# -*- coding: utf-8 -*-'''Usage: ccal Month [4-Digit-Year]or: ccal 4-Digit-Year MonthThis Python script is to show Solar and Lunar calender at thesame time. You need to have Python (2.0 or above) installed.Acceptable date range: 1900/2 -- 2049/12Output contains Chinese characters (mainland GB2312 encoding),must be viewed in a Chinese-enabled system or "cxterm" etc.programms under UNIX X-Windows.The major reference for me to compose this program is:lunar-2.1.tgz (1992), composed byFung F. Lee <lee@> andRicky Yeung <Ricky.Yeung@> .And Lee and Yeung refered to:1. "Zhong1guo2 yin1yang2 ri4yue4 dui4zhao4 wan4nian2li4"by Lin2 Qi3yuan2. 《中国阴阳⽇⽉对照万年历》.林2. "Ming4li3 ge2xin1 zi3ping2 cui4yan2" by Xu2 Le4wu2.《命理⾰新⼦平粹⾔》.徐3. Da1zhong4 wan4nian2li4. 《⼤众万年历》Version:0.3.2, Jan/16/2007, according to sprite's information, changed 3 codes:1954: 0x0a5d0 --> 0x0a5b0, 1956: 0x052d0 --> 0x052b01916: 0x0d6a0 --> 0x056a00.3.1, Jan/15/2007, changed 1978's code from 0xb5a0 to 0xb6a0.A young lady's birth day (lunar 1978/8/4) problem reportedon internet -- informed by sprite at 0.3.0, Sep/25/2006, add coding line, prevent python to report warning0.2.0, Jan/6/2002, ShengXiao(⽣肖), lunar leap month(闰⽉)added.0.1.0, Jan/4/2002--- Changsen Xu <xucs007@>'''#Remember, in this program:# month=0 means Januaray, month=1 means February ...;# day=0 means the first day of a month, day=1 means the second day,# so as to ease manipulation of Python lists.# year=0 is 1900, until the last step to outputdaysInSolarMonth= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]lunarMonthDays = [29,30] # a short (long) lunar month has 29 (30) days */shengXiaoEn = ["Mouse", "Ox", "Tiger", "Rabbit", "Dragon", "Snake","Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"]shengXiaoGB = ["⿏", "⽜", "虎", "兔", "龙", "蛇", "马", "⽺", "猴", "鸡","狗", "猪"]zhiGB = ["⼦", "丑", "寅", "卯", "⾠", "巳", "午", "未", "申", "⾣","戌", "亥"]ganGB = ["甲", "⼄", "丙", "丁", "戊", "⼰", "庚", "⾟", "壬", "癸"] monthEn = ['January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November','December']weekdayEn = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]weekdayGB = ["⼀", "⼆", "三", "四", "五", "六", "⽇"]numGB = ['○', "⼀", "⼆", "三", "四", "五", "六", "七", "⼋", "九","⼗"]lunarHoliday = {'0_0':'春节', '4_4':'端午', '7_14':'中秋', '8_8':'重阳','0_14':'元宵'}# encoding:# b bbbbbbbbbbbb bbbb# bit# 1 111111000000 0000# 6 543210987654 3210# . ............ ....# month# 000000000111# M 123456789012 L## b_j = 1 for long month, b_j = 0 for short month# L is the leap month of the year if 1<=L<=12; NO leap month if L = 0. # The leap month (if exists) is long one if M = 1.yearCode = [0x04bd8, # 19000x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, # 19050x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, # 19100x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, # 19150x056a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, # 19200x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, # 19250x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, # 19300x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, # 19350x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, # 19400x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, # 19450x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, # 19500x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, # 19550x052b0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, # 19600x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, # 19650x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, # 19700x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, # 19750x0d558, 0x0b540, 0x0b6a0, 0x195a6, 0x095b0, # 19800x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, # 19850x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, # 19900x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, # 19950x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, # 20000x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, # 20050x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, # 20100x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, # 20150x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, # 20200x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, # 20250x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, # 20300x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, # 20350x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, # 20400x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, # 20450x0aa50, 0x1b255, 0x06d20, 0x0ada0 # 2049]yearsCoded = len(yearCode)from sys import argv, exit, stdoutfrom time import time, localtimeow=stdout.writeclass LunarYearInfo:def __init__(self):self.yearDays = 0self.monthDays = [0]*13self.leapMonth = -1 # -1 means no lunar leap monthyearInfo = [0]*yearsCoded #global variablefor i in range(yearsCoded):yearInfo[i] = LunarYearInfo()class Date:def __init__(self, year, month, day, weekday=-1, gan=-1, zhi=-1):self.year =yearself.month =monthself.day =dayself.weekday=weekdayself.gan =ganself.zhi =zhisolar1st = Date(0, 0, 30, weekday=2) #Wednesday, January 31, 1900 lunar1st = Date(0, 0, 0, weekday=2, gan=6, zhi=0)#Wednesday, First day, First month, 1900, 庚⼦年def error(msg):print 'Error:', msg; exit(0)def isSolarLeapYear (year):year=year+1900return (year%4 == 0) and (year%100 != 0) or (year%400 == 0) baseYear=1201 - 1900# in fact, real baseYear=1201. In order to ease calculation of# leap years. real baseYear must conform to:# realBaseYear%4==1 and realBaseYear%400==1.# Assert realBaseYear < solar1st.year .# Compute the number of days from the Solar First Date# month=0 means January, ...def solarDaysFromBaseYear(d): #d is a Date classdelta = d.year - baseYearoffset = delta*365 + delta/4 - delta/100 + delta/400for i in range(d.month):offset += daysInSolarMonth[i];if d.month>1 and isSolarLeapYear(d.year):offset += 1offset += d.day## print '___', year, month, day, 'offset=', offset ########return offset# Compute the number of days from the Solar First Date# month=0 means January, ..., year=0 means 1900, ...def solarDaysFromFirstDate (d): #d is a Date classreturn solarDaysFromBaseYear (d) - solarDaysFromBaseYear (solar1st) def calcLunarDaysPerMonth(iYear):code = yearCode[iYear]leapMonth = code&0xf #leapMonth==0 means no lunar leap monthcode >>= 4for iMonth in range(12):yearInfo[iYear].monthDays[11-iMonth] = lunarMonthDays [code&0x1] code >>= 1if leapMonth>0:yearInfo[iYear].leapMonth = leapMonth-1yearInfo[iYear].monthDays.insert (leapMonth,lunarMonthDays [code & 0x1])def calcAllLunarYearsInfo():for iYear in range(yearsCoded):calcLunarDaysPerMonth (iYear)for iMonth in range(13):yearInfo[iYear].yearDays += yearInfo[iYear].monthDays[iMonth]#input dateSolar, return (dateLunar, isLunarMonthOrNot)def solar2Lunar(d): #d is a Date classdLunar = Date(-1, -1, -1) #unknown lunar Date classoffset = solarDaysFromFirstDate(d)dLunar.weekday = (offset + solar1st.weekday)%7for iYear in range(yearsCoded):if offset < yearInfo[iYear].yearDays:dLunar.year = iYear; breakoffset -= yearInfo[iYear].yearDaysif dLunar.year == -1: error ("Date out of range.")dLunar.gan = (dLunar.year + lunar1st.gan) % 10dLunar.zhi = (dLunar.year + lunar1st.zhi) % 12for iMonth in range(13):if offset< yearInfo[dLunar.year].monthDays[iMonth]:dLunar.month = iMonth; breakoffset -= yearInfo[dLunar.year].monthDays[iMonth]dLunar.day = offsetisLeapMonth=0if yearInfo[dLunar.year].leapMonth >=0:if dLunar.month == yearInfo[iYear].leapMonth + 1:isLeapMonth=1if dLunar.month > yearInfo[dLunar.year].leapMonth:dLunar.month -= 1return (dLunar, isLeapMonth)def getSolarDaysInMonth (year, month):if isSolarLeapYear(year) and month==1:return 29else: return daysInSolarMonth[month]def num2GB (num):if num==10:return '⼗'elif num>10 and num<20:return '⼗' + numGB[num-10]tmp=''while num>10:tmp = numGB[num%10] + tmpnum = int(num/10)tmp = numGB[num] + tmpreturn tmpdef lunarDate2GB (dLunar, isLeapMonth):tmp = str(dLunar.month)+'_'+str(dLunar.day)if lunarHoliday.has_key( tmp ):return '[0;33;44m%s[0m '% lunarHoliday[tmp] + \' '*(6-len(lunarHoliday[tmp]))elif dLunar.day==0:tmp2 = '闰'*isLeapMonth + num2GB(dLunar.month+1) +'⽉'return '[7m%s[0m' % tmp2 + ' '*(8-len(tmp2))elif dLunar.day<10:return '初' + num2GB(dLunar.day+1)else:return num2GB(dLunar.day+1)def outputCalendar(year, month):dLunar = Date(-1,-1,-1)ow ('\n 阳历%d年%d⽉ ' % (year+1900, month+1) )for iDay in range( getSolarDaysInMonth(year, month) ):dSolar = Date(year, month, iDay)dLunar, isLeapMonth = solar2Lunar (dSolar)if iDay==0:ow ('始于阴历%s年%s%s⽉ (%s%s年, ⽣肖属%s)\n' %( num2GB(dLunar.year+1900), '闰'*isLeapMonth,num2GB(dLunar.month+1),ganGB [dLunar.gan], zhiGB[dLunar.zhi], shengXiaoGB[dLunar.zhi] ))ow ('='*74 + '\n')for i in range(7):ow ("%3s %2s " % (weekdayEn[i][:3], weekdayGB[i]) )ow('\n\n')for i in range(dLunar.weekday): ow(' '*11)elif dLunar.weekday==0: ow('\n')ow ( "%2d %-8s" %(iDay+1, lunarDate2GB(dLunar, isLeapMonth) ) )ow('\n\n')def checkArgv (argv):argc = len(argv)if argc==1 or argv[1] in ('-h', '--help'):print __doc__; exit(0)#in case people input arguments as "4-digit-year month"if argc==3 and len(argv[1]) == 4 and len(argv[2]) in (1,2):argv[1], argv[2] = argv[2], argv[1]#Get monthmonth=-1for iMonth in range(12):if argv[1].lower() == monthEn[iMonth].lower() or \argv[1].lower() == monthEn[iMonth][:3].lower():month = iMonth+1; breakif month==-1:month = eval(argv[1])if month<1 or month>12: error ("Month not within 1--12.")#Get yearif argc==2: year = localtime(time())[0]else:if len(argv[2]) != 4: error ("Year must be 4 digits.")year = eval(argv[2])if year<1900 or year>= 1900+yearsCoded or (year==1900 and month==1):error ("Year must be within %d--%d, excluding 1900/1."% (1900, 1900 + yearsCoded-1) )return year-1900, month-1year, month = checkArgv(argv)calcAllLunarYearsInfo()outputCalendar(year, month)这个也有问题(1989年8⽉的数据转换成农历就有问题)看了好⼏个程序,发现实现这个并不需要什么NB的算法(好像也不存在这样的算法)可以直接实现阳历转为阴历的,都是记录了⼀堆阴历的数据,然后根据和基本时间来算相差⼏天来计算的,所有阴历数据的正确性决定了这个程序的正确性。
公历换算农历公式
公历换算农历公式
想要将公历转换为农历,可以根据公式:公元年数—1901(或1977)=R+4Q;那么农历日期=10.6(1+R)+14Q+年内日期序数—29.5n(n、R、Q都是自然数,R<4)。
这个公式算法对于很多数学不好的人而言是很费脑子的,算大半天也算不出来,而当今科技是比较发达的,我们想要将进行公农历转换并不需要这么复杂的计算。
现在,想要将公农历进行转换方法很简单,比较传统的一个方法就是可以直接看挂历或是台历,上面每个公历日期的下面都会标注都相对应的农历日期,我们只需一翻阅就能查询到公历相对应的农历日期了。
比如我们要看2021年7月2日的农历日期,7月2日的下面就会显示农历日期为五月廿三。
对于公农历转换公式是什么,我们已经了解了,但是它的是比较复杂的,而现在是网络普及的一个时代,平板、手机以及电脑等等电子产品也都设置有万年历这中功能,所以对于公历与农历的转换,一查看就可以了,很方便。
并且与传统的挂历、台历本子而言,电子设备上的日期不局限于一年的日期,这给人们的生活、学习以及日常工作等更方便。
好了,公历是国际通过的历法,当年日期的记录均是以阳历为准,但农历是我国传统的一种日期记录方式,在实际上生活中难免会用到公农历转换。
我们知道公农历转换公式是什么,但是算法复杂,我们大可不必去计算,看挂历即可。
阳历和阴历转换算法
阳历和阴历转换算法
一、阳历和阴历的区别
阳历是以太阳行星运行轨道周期来计算的历法,也称为公历,它将一年分为12个月,每月大约29天左右。
阴历是按照农历的月份来排列的,一年有12个月,每月大约有29或30天。
二、历法计算原理
(1)阳历
阳历是按照太阳行星的运行周期计算的,一年的太阳行星运行周期为365.2422天,因此,每隔四年多少天就添加一天,称为闰年,这样一年可以分成365或366天。
(2)阴历
三、阳历和阴历之间的转换
1、阳历转换成阴历
1)计算年份
首先,我们要知道要转换的年份是否是闰年,是则记闰月为29天,不是则记闰月为28天。
2)计算月份
根据今年的起始月份,以及今年之前的年份闰月天数,可以计算出今年的闰月日期,根据要转换的年份和月份,可以确定当前的月份,从而转换成阴历的月份。
3)计算日期
根据转换后阴历的月份和日期,结合当月的起始日期,可以计算出当月的日期,即为转换后的阴历日期。
4)计算多余的天数
转换成阴历之后,如果有多余的天数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++中怎样将阳历转化成农历
已关闭20[ 标签:c++, 阳历, 农历 ] 小^鱼、2011-05-03 11:06
推荐答案
一、原理篇
1.公历转换农历的算法
公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。
比较常用并且比较简单的公历转换农历算法就是查表方法。
首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来(在我的C++类中,是从1900年作为起点的。
选择一个起始点的思想十分重要,在下面的干支纪法和二十四节气中也体现到了)。
回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。
那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。
如何简化呢?
要保存一年的信息,其实只要两个信息就可以了:(1)农历每个月的大小;(2)今年是否有闰月,闰几月以及闰月的大小。
用一个整数来保存这些信息就足够了。
具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉了12位,再用低四位来表示闰月的月份,没有闰月记为0。
比如说,2000年的信息数据是0x0c960,转化成二进制就是1100100101100000,表示的含义是1、2、5、8、10、11月大,其余月小,低四位为0说明没有闰月。
2001年的农历信息数据是0x0d954,其中的4表示该年闰4月,月份大小信息就是0x0d95,具体的就是1、2、4、5、8、10、12月大,其余月小。
这样就可以用一个数组来保存这些信息。
在我的C++类中是用m_lunarInfo这个数组来保存这些信息的。
下面就是公历转换成农历的具体算法:
(1)计算所求时间到起始年正月初一的天数。
(2)从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止。
此时,m_lunarInfo的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月。
如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月。
剩余的天数就是农历日。
(具体实现时有所改进。
)
2.利于泰勒公式巧算星期
在应用数学中有一个计算某一天是星期几的公式,这就是泰勒公式。
公式如下:
w = [c÷4] - 2c + y + [y÷4] + [26(m+1)÷10] + d - 1,其中w就是所求日期的星期数。
如果求得的数大于(小于)7,就减去(加上)7的倍数,直到余数小于7为止。
式子中c是指公
元年份的前两位数字,y是后两位数字,m是月数,d是日数。
方括弧[]表示对于括号中的数字取整。
还有一个特别要注意的地方:所求的月份如果是1月或2月,则应视为上一年的13月或14月,也就是公式中m的取值范围是从3到14而不是从1到12。
3.干支纪法
天干有十个,就是甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支有十二个,依次是子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
古人把它们按照一定的顺序而不重复地搭配起来,从甲子到癸亥共六十对,叫做六十甲子。
我国古人用这六十对干支来表示年、
得到年、月、日的干支表示原理是相同的,即所求的年、月、日到起始年、月、日所经历的年数、月数、天数,加上起始年、月、日干支表示在上表中的序号,与10取模得到天干的序号,与12取模得到地支的序号。
以年为例,1900年立春后为庚子年,查上表可知,庚子年为六十甲子的第36位,所以所求年份m_year到1900年的年数为m_year-1900+36-1(如果月份m_month小于等于2月)或m_year-1900+36(如果月份m_month大于2月)。
同理,可以得到月、日的干支表示。
最后,还要依据节气(立春)调整二月份的干支纪年;依据每月的第一个节气的日期调整月的干支表示,具体情况源程序中有详细的说明。
古人根据太阳升起的时间,将一昼夜区分为十二个时辰,用十二地支为代号。
如果用m_hour表示公历现在的小时数(二十四表示法),则(m_hour+1)/2就得到时间的地支表示(其实是地支的序号)。
4.二十四节气
节气就实质而言是属于阳历范畴,从天文学意义来讲,二十四节气是根据地球绕太阳运行的轨道(黄道)360度,以春分点为0点,分为二十四等分点,两等分点相隔15度,每个等分点设有专名,含有气候变化、物候特点、农作物生长情况等意义。
二十四节气即立春、雨水、惊蜇、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至、小寒、大寒。
以上依次顺属,逢单的均为"节气",通常简称为"节",逢双的则为"中气",简称为"气",合称为"节气"。
现在一般统称
为二十四节气。
自古节气的推算是由一年平分24等分所得的平节气。
旧历用平气法推算二十四气,此法将一回归年均分成二十四等分,从冬至开始等间隔地依次相间安排各个节气及中气,而各气之间太阳所运行的度数因此并不相等。
新历推算则用定气法,此法将黄道上的周天度数等分成二十四份,太阳移至某一分点时,即定为某一节气的日期,由于太阳的视运动迟速不均,因此各节气间相隔的时间亦不等。
但不论新历或旧历,均取冬至为二十四气之首,故在春、秋分时彼此的差别最大。
为何中国传统历家早知推算定气,却又习用平气注历?此主要或由于平气易于计算所致,因在此法之下,各节气与节气间或中气与中气间相隔固定为三十日五时辰又二刻。
本C++类中实现二十四节气的计算,使用的是平节气的简单算法。
用数组sTermInfo
记录从小寒开始的各个节气相对于小寒所经历的分钟数,并用int sTerm(int y, int n)函数得到某年y的第n个节气为所在月的第几日(n从0小寒起算)。
由于没有考虑岁差与章动,所以精确度不是很高。