如何在c++中将公历转换成农历
1.公历转换为农历的算法
公历和中国农历的换算不是一个简单的公式就能完成的,换算比较复杂,因为农历的公式相当复杂,是根据天文观测指定的。
阳历转换为阴历常用且简单的算法是查表法。首先要保存公历农历的换算信息:以任意一年为起点,保存从这一年开始的若干年的农历信息(在我的C++类中是从1900开始)。选择起点的想法很重要,这也体现在下面的戒律和二十四节气中。回想一下,我们平时是怎么把阳历换算成阴历的?就是查阅历书,里面有每一天的阳历和阴历。直接查就行了。那么我们能做同样的事情吗?当然,但是包含每天的信息需要做很多工作,所以我们应该简化这些信息。怎么简化呢?
保存一年的信息,其实只需要两条信息:(1)农历每个月的大小;(2)今年是否有闰月、闰月以及闰月的大小。使用一个整数来存储这些信息就足够了。具体方法是用一位数表示一个月的大小,大月为1,小月为0,这样就用12位数,再用低四位数表示闰月,没有闰月为0。比如2000年的信息数据是0x0c960,换算成二进制就是1101105438+000000,也就是1,2,5,8,65400。2001年的农历信息数据为0x0d954,其中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.干部和支部的纪律
有十个天干,即甲、乙、丙、丁、戊、己、庚、辛、任、桂,十二个地支,即子、丑、阴、卯、辰、巳、午、卫、申、酉、戌、亥。古人把它们按一定顺序配对,不重复,从甲子到桂海* * *六十对,称为六十甲子。我国古人用这60对树枝来代表年、月、日、时的序号,周而复始,这就是枝、枝之纪。
0甲子
1丑b。
2丙寅
3丁卯
4陈武
5集集集
6武庚
7韦辛
8任申
9贵由10徐佳
11怡海
12冰姿
13丁丑
14武银
15集贸
16陈赓
17辛集
18仁武
19桂威20沈嘉
21益友
22徐兵
23定海
24五子
25丑
26庚寅
27辛卯
28仁臣
29个癸有30个吴佳
31 B魏
32沈冰
33丁友
34改革运动
35己亥
36庚子
37辛丑
38人饮
39桂茂40陈佳
41 B有
42吴冰
43丁伟
44武神
45姬友
46耿旭
47辛亥
48壬子
49桂畴50佳音
51毛毅
52陈冰
53丁基
54五五
55个没有
56庚申
57心有
任旭58号
表示年、月、日的干、枝的原理是一样的,即从年、月、日到起始年、月、日的年、月、日数,加上上表中起始年、月、日的干、枝序号,干、枝序号取模10,干、枝序号取模12。以年为例,1900之后的立春是庚子年。从上表可以看出,庚子年是六十年中的第36年,那么从m_year到1900的年数就是m_year-1900+36-1(如果月是m_month,同样的,我们可以得到月和日的表示。最后,根据节气(立春),要调整公历2月。根据每个月第一个节气的日期,调整月干支表示,具体情况在源程序中有详细说明。
古人根据太阳升起的时间将一昼夜分为十二个时辰,以十二地支为代码。如果用m_hour来表示公历的当前时数(二十四记数法),(m_hour+1)/2会得到时间的地支表示法(其实就是地支的序号)。
4.二十四节气
本质上,节气属于阳历。从天文学的角度来说,二十四节气是按照地球绕太阳公转(黄道)360度分为二十四等份的,以春分为零点。两个等分点相隔15度,每个等分点都有一个专有名称,包含了气候变化、物候特征和作物生长的意义。二十四节气是立春、下雨、惊奇、春分、清明、谷雨、长夏、小满、芒种、夏至日、小暑、大暑、立秋、初暑、白露、秋分、寒露、初霜、立冬、小雪、大雪、冬季至日、小寒、严寒。在上面的顺序中,所有的单间都是“节气”,通常称为“节气”,而双间是“中气”,简称“气”,统称为“节气”。现在一般称为二十四节气。
自古以来,节气的计算都是将一年等分为24等份得到的平节气。在旧历中,24气是用平气的方法计算的,这种方法将一个回归年分成24等份,并从冬季至日开始以相等的间隔依次排列节气和中气,因此太阳在气中运行的程度是不相等的。新历法是用恒空法计算的,它把黄道上的星期天的度数分成24个部分。当太阳运行到某个春分点时,就被设定为一个节气的日期。因为太阳的视运动是不均匀的,节气之间的时间间隔也是不相等的。然而,无论是新历法还是旧历法,冬季的至日都是二十四气之首,所以它们之间的差异在春秋分是最大的。为什么中国传统的编年史家知道如何计算定气,却习惯用平气记历法?这主要是因为平气容易计算,因为在这种方法下,每个节气与节气之间或中气与中气之间的间隔固定为30天5小时2个季度。
在这个C++类中,用一个简单的平节气算法实现了24节气的计算。数组sTermInfo用于记录每个节气从小寒开始相对于小寒的分钟数,函数int sTerm(int y,int n)用于获取一年中第n个节气所在的月份中的某一天(n从0小寒开始计数)。因为没有考虑岁差和章动,所以精度不是很高。