公历转农历、巧算星期、干支、节气 算法原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、公历转换农历的算法
公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。比较常用并且比较简单的公历转换农历算法就是查表方法。首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来。回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。如何简化呢?
下面的三个表格是农历数据表 LunarCalendarTable 的结构。总共使用了32位整数的0~23位。
计算公历日对应的农历日期的方法:先计算出公历日离当年元旦的天数n1,然后查表取得当年的春节日期,计算出春节离元旦的天数n2,二者相减即可算出公历日离春节的天数n3,以后再根据大小月和闰月信息就可以计算n3减去农历的每月天数,减的次数就是农历月份,最后剩余的天数就是农历日。
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、干支纪法
天干是:甲、乙、丙、丁、戊、己、庚、辛、壬、癸,也叫天干;地支是:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥,也称十二地支。干支还是阴阳之分:甲、丙、戊、庚、壬为阳干,乙、丁、己、辛、癸为阴干;子、寅、辰、午、申、戌为阳支,丑、卯、巳、未、酉、亥为阴支。以一个天干和一个地支相配,排列起来,天干在前,地支在后,天干由甲起,地支由子起,阳干配阳支,阴干配阴支(阳干不配阴支,阴干不配阳支),天干经六个循环,地支经五个循环正好是六十,就叫做“六十干支”。按照这样的顺序每年用一对干支表示,六十年一循环,叫做“六十花甲子”。
六十花甲子
1.甲子 11.甲戌 21.甲申 31.甲午 41.甲辰 51.甲寅
2.乙丑 12.乙亥 22.乙酉 32.乙未 42.乙巳 52.乙卯
3.丙寅 13.丙子 23.丙戌 33.丙申 43.丙午 53.丙辰
4.丁卯 14.丁丑 24.丁亥 34.丁酉 44.丁未 54.丁巳
5.戊辰 15.戊寅 25.戊子 35.戊戌 45.戊申 55.戊午
6.已巳 16.已卯 26.已丑 36.已亥 46.已酉 56.已未
7.庚午 17.庚辰 27.庚寅 37.庚子 47.庚戌 57.庚申
8.辛未 18.辛巳 28.辛卯 38.辛丑 48.辛亥 58.辛酉
9.壬申 19.壬午 29.壬辰 39.壬寅 49.壬子 59.壬戌
10.癸酉 20.癸未 30.癸巳 40.癸卯 50.癸丑 60.癸亥
干支纪年法:
如甲子为第一年,乙丑为第二年,丙寅为第三年......六十年为一周。一周完了,再由甲子年起,周而始,循环下去。例如1929年是农历己巳年,1930年是农历庚午年 (1989)
又是农历己巳年。我们在日历上看到的己巳年、庚午年,就是按干支纪年这种方法排列下来的。阳历年份除以60的余数减3便得该年农历干支序号数,再查上面的干支便是干支年纪。如果序号数小于、等于零则于支序号数加60。例如,求1991年干支;1991÷60=33余11,年干支序号数=11-3=8。查干支表知该年为辛未年。又如求1983年干支:1983÷60=33余3,干支序号=3-3=0,加上60,查干支表知该年为癸亥。
干支纪月法:
干支纪月法未普遍实行,主要为星相家推算八字用。其方法为:若遇甲或己的年份,正月是丙寅;遇上乙或庚之年,正月为戊寅;丙或辛之年正月为庚寅,丁或壬之年正为为壬寅,戊或癸之年正月为甲寅。正月之干支知道了,其余月可按六十甲子的序推知。
干支纪日法:
甲炎了第一日,乙丑为第二日,丙寅为第三日……60日为一周。一周完了再由甲子日起,周而复始,循环下去。例如农历己巳年(1989年)正月初一是丁酉日,初二是戊戌日……到三月初七正好是60天,因此三月初二又是丁酉日。
干支纪时法:
一天中时辰的地支也是确定的,所以二十四小时配十二地支,由夜间十一点至一点为子时,
一点至三点为丑时,其余照推。时的天由该日所对天干推求,其歌戾如下:
甲己还生甲,乙庚丙作初,
丙辛从戊起,丁壬庚子居,
戊癸何方发,壬子是真途。
即若该日是甲或己的,在子时上配上甲为甲子;日是乙或庚的,在子时上配上丙为丙子;丙辛日子时配上戊为戊子;丁任日为庚子;戊癸日为壬子。知道了子时的干支,便可推知其余。
4.二十四节气
节气就实质而言是属于阳历范畴,从天文学意义来讲,二十四节气是根据地球绕太阳运行的轨道(黄道)360度,以春分点为0点,分为二十四等分点,两等分点相隔15度,每个等分点设有专名,含有气候变化、物候特点、农作物生长情况等意义。二十四节气即立春、雨水、惊蜇、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至、小寒、大寒。以上依次顺属,逢单的均为"节气",通常简称为"节",逢双的则为"中气",简称为"气",合称为"节气"。现在一般统称为二十四节气。
自古节气的推算是由一年平分24等分所得的平节气。旧历用平气法推算二十四气,此法将一回归年均分成二十四等分,从冬至开始等间隔地依次相间安排各个节气及中气,而各气之间太阳所运行的度数因此并不相等。新历推算则用定气法,此法将黄道上的周天度数等分成二十四份,太阳移至某一分点时,即定为某一节气的日期,由于太阳的视运动迟速不均,因此各节气间相隔的时间亦不等。但不论新历或旧历,均取冬至为二十四气之首,故在春、秋分时彼此的差别最大。为何中国传统历家早知推算定气,却又习用平气注历?此主要或由于平气易于计算所致,因在此法之下,各节气与节气间或中气与中气间相隔固定为三十日五时辰又二刻。