如何在c++中将公历转换为农历

第一,原创文章

1.公历转换为农历的算法

公历和中国农历之间的转换不是一个简单的公式就可以完成的,转换更复杂,因为农历的公式相当复杂,是根据天文观测指定的。

将公历转换为农历的常用而简单的算法是查表法。首先要保存公历农历的换算信息:以任意一年为起点,保存从今年开始的几年的农历信息(在我的C++类中是从1900开始)。选择起点的想法非常重要,这也体现在下面的纪律和二十四节气中。回想一下,我们通常如何将公历转换为农历?它是查阅年历,其中包含每天的阳历和阴历。直接查就行了。那么我们能做同样的事情吗?当然可以,但是要包含每天的信息需要大量的工作,所以我们应该简化这些信息。如何简化?

要保存一年的信息,实际上只需要两条信息:(1)农历中每个月的大小;(2)今年是否有闰月、闰月的月份以及闰月的大小。使用一个整数来存储这些信息就足够了。具体方法是用一位数表示一个月的大小,大月份是1,小月份是0,这样就用12位数,然后用低四位数表示闰月,没有闰月就是0。比如2000年的信息数据是0x0c960,换算成二进制就是1100101100000,就是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壬辰

二十九日癸巳三十日吴佳

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小寒开始计数)。因为没有考虑岁差和章动,所以精度不是很高。