公历和农历转换算法详解
500年来农历转公历表
500年来农历转公历表一、介绍农历和公历是我们常用的两种历法。
农历是根据月亮运行周期来计算的,而公历则是根据太阳运行周期来计算的。
由于两种历法的计算方式不同,所以农历和公历之间的转换一直是人们关注的话题。
本文将以500年来农历转公历表为主题,介绍农历到公历的转换规则和方法。
二、农历转公历的原理农历是根据农历月份和农历日来计算的,而公历是根据年、月、日来计算的。
农历的年份是根据农历年的干支纪年法来计算的,所以农历的年份和公历的年份并不一致。
农历的月份是根据农历的月相来计算的,一年有12个月。
农历的日子是根据农历月的大小月来计算的,大月有30天,小月有29天或者28天。
所以农历的日期是根据月相和大小月来计算的,与公历的日期并不一致。
三、农历转公历的方法农历转公历的方法有多种,以下是其中一种常用的方法:1. 先确定农历年份对应的公历年份,这个可以通过农历年的干支纪年法来确定。
例如,农历年份为甲子年,对应的公历年份可以通过干支纪年法的计算得到。
2. 再确定农历月份对应的公历月份,这个可以通过农历的月相来确定。
例如,农历月相为初一,对应的公历月份可以通过农历月相和大小月的计算得到。
3. 最后确定农历日期对应的公历日期,这个可以通过农历月的大小月来确定。
例如,农历是大月,对应的公历日期就是农历日期。
如果农历是小月,对应的公历日期就是农历日期减去小月的天数。
四、农历转公历实例以农历转公历表为例,我们来看看最近500年来的农历转公历的情况:1. 农历年份:甲子年,对应的公历年份为1904年。
农历月份:正月,对应的公历月份为2月。
农历日期:初一,对应的公历日期为2月19日。
2. 农历年份:乙丑年,对应的公历年份为1905年。
农历月份:二月,对应的公历月份为3月。
农历日期:十五,对应的公历日期为3月17日。
3. 农历年份:丙寅年,对应的公历年份为1906年。
农历月份:三月,对应的公历月份为4月。
农历日期:初六,对应的公历日期为4月7日。
阴历阳历转换计算公式
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. 检查是否为闰年,闰年的判断规则是:公历年份能够被4整除但不能被100整除,或者能够被400整除的年份为闰年。
如果待转换的年份是闰年,则在后面的步骤中月份的天数需要进行调整。
3. 农历每年的正月初一对应的阳历日期不同,所以需要首先确定农历某一年对应的正月初一的阳历日期。
- 可以查找一些农历和阳历的对应表,查找待转换的年份对应的正月初一的阳历日期。
- 也可以使用一些公式进行计算,但比较复杂,具体公式可以在一些相关书籍或网站中查找。
4. 在确定了农历的正月初一对应的阳历日期之后,就可以根据待转换的阳历日期和正月初一的阳历日期进行计算,得出对应的农历日期。
接下来,我们来看农历转阳历的方法。
农历转阳历主要涉及到年份、月份和日期的转换。
具体步骤如下:1. 首先确定待转换的农历日期,包括年份、月份和日期。
2. 首先确定转换的年份是否为闰年,闰年的判断方法同上述阳历转农历中的判断方法。
3. 确定农历某一年对应的正月初一的阳历日期。
4. 根据待转换的农历日期和正月初一的阳历日期进行计算,得出对应的阳历日期。
综上所述,阳历和农历的转换需要注意年份是否为闰年以及确定正月初一的阳历日期。
转换的方法可以通过查找对应表或使用一些公式进行计算。
如果只是简单的进行阳历和农历的转换,可以参考一些在线的农历转换工具或手机应用。
如果需要深入了解阳历和农历的转换原理以及计算方法,可以查阅相关书籍或网站。
希望以上内容能够对您有所帮助。
最新最准公历和农历转换算法详解
最新最准公历和农历转换算法详解公历(阳历)和农历(阴历)是中国传统的两种历法,公历采用太阳历,以地球绕太阳运行为基础,而农历是以月球运行为基础。
公历更准确地反映了太阳运行的变化,而农历则更加贴近农业生产和民俗习俗的需求。
公历和农历之间的转换涉及到一个重要的问题,即如何确定其中一年是闰年还是平年,以及每个月有多少天。
因为农历中的月份天数不规则,而公历中的月份天数相对固定。
最准确的公历和农历转换算法是以历法的数学及历史研究为基础的,它考虑了太阳和月球的运行轨迹,以及历法制订时的政治和文化背景等方面,下面详细介绍这个算法。
1.公历转农历:公历转农历的核心问题是确定其中一年闰月的位置和天数。
一般而言,公历转农历的过程如下:(1)确定公历年份。
(2)根据公历年份的规则,计算闰年的次数。
公历规定,4年一闰,100年不闰,400年又要闰。
因此,可以通过一系列的除法和取余运算,判断其中一年是否是闰年。
(3)确定农历年份。
根据闰年的次数,可以推算其中一年距离公元前一年农历年份的偏移量。
再加上历史上确定的一个公历对应农历年份的偏移量,即可确定农历年份。
(4)确定农历月份。
根据农历月份的规则,即按照一定的数学计算公式,可以确定其中一年的闰月位置。
具体的算法很复杂,涉及到太阳、月球的轨迹计算,需要使用较为复杂的数学运算方法,如三角函数等。
(5)确定农历日期。
在确定了农历月份的基础上,根据农历每个月的天数规则,可以确定其中一天的农历日期。
2.农历转公历:农历转公历也面临着确定闰年的问题。
农历转公历的过程如下:(1)确定农历年份和月份。
根据农历日期,确定农历当前年份和月份。
(2)根据农历年份的规则,计算闰年的次数。
农历中的闰年规则和公历中的规则略有不同,需要根据历史数据和规则进行计算。
(3)确定公历年份。
根据农历年份和闰年的次数,可以推算其中一年距离公元前一年公历年份的偏移量。
再加上历史上确定的一个农历对应公历年份的偏移量,即可确定公历年份。
阴历阳历转换计算公式
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日。
公历转阴历
首先是要保存公农历之间的转换信息:以任意一年作为起点,把从这一年起若干年(若干是多少?就看你的需要了)的农历信息保存起来(在我的VCL中,是以1921年作为起点)。
回想一下,我们平常是怎样来转换公历农历的呢?是查万年历,万年历有每一天的公历农历,直接一查就可以了。
那么我们可不可以也这样做呢?当然可以,但是,这样做就要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。
怎么简化呢?要保存一年的信息其实只要两个信息就可以了:1、农历每个月的大小;2、今年是否有闰月,闰几月以及闰月的大小。
用一个整数来保存这些信息就足够了。
具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉12位(无闰月)或13位(有闰月),再用高4位来表示闰月的月份,没有闰月记为0。
比如说,2000年的信息数据是是0xC96,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小;2001年的农历信息数据是0x41A95,其中4表示今年闰四月,月份大小信息就是0x1A95(因为闰月,所以有13位),具体的就是1、2、4、5、8、10、12月大,其余月份小(0x1A95=1101010010101B),要注意在四月的后面那一个0表示的是闰四月小,接着的那个1表示5月大。
这样就可以用一个数组来保存这些信息。
在我的VCL程序中是用ChineseCalendarData[]这个数组来保存这些信息。
为了方便对算法的理解,首先来看看我的VCL组件hsDivineCalendar的头文件//---------------------------------------------------------------------------#ifndef hsDivineCalendarH#define hsDivineCalendarH#define ALLYEARS 100 //定义转换的年数:100年//---------------------------------------------------------------------------#include <SysUtils.hpp>#include <Controls.hpp>#include <Classes.hpp>#include <Forms.hpp>//---------------------------------------------------------------------------class PACKAGE ThsDivineCalendar : public TComponent{private:int ChineseCalendarData[ALLYEARS]; //农历数据AnsiString str2,num; //要用的字符串void __fastcall c2e(); //农历到公历void __fastcall e2c(); //公历到农历TDateTime TheDate; //日期int FYear,FMonth,FDay,FTime; //公历年月日时int FcYear,FcMonth,FcDay,FcTime; //农历年月日时AnsiString __fastcall GetDateString(); //获取日期字符串AnsiString __fastcall GetcDateString(); //获取农历日期字符串int __fastcall GetBit(int m,int n); //获取1bitvoid __fastcall GetYMD(); //获取年月日void __fastcall SetDate(TDateTime); //用一个TDateTime类型的变量转换 //-----------分别修改公历的年月日时-------------------------------------void __fastcall SetYear(int AYear){SetBy(AYear,FMonth,FDay,FTime);};void __fastcall SetMonth(int AMonth){SetBy(FYear,AMonth,FDay,FTime);};void __fastcall SetDay(int ADay){SetBy(FYear,FMonth,ADay,FTime);};void __fastcall SetTime(int ATime){SetBy(FYear,FMonth,FDay,ATime);};//-----------分别修改农历的年月日时---------------------------------------void __fastcall SetcYear(int AcYear){SetByc(AcYear,FcMonth,FcDay,FcTime);};void __fastcall SetcMonth(int AcMonth){SetByc(FcYear,AcMonth,FcDay,FcTime);}; void __fastcall SetcDay(int AcDay){SetByc(FcYear,FcMonth,AcDay,FcTime);};void __fastcall SetcTime(int AcTime){SetByc(FcYear,FcMonth,FcDay,AcTime);}; TDateTime __fastcall GetLastJie(); //取得上一个节TDateTime __fastcall GetNextJie(); //取得下一个节TDateTime __fastcall GetLastQi(); //取得上一个中气TDateTime __fastcall GetNextQi(); //取得下一个中气int __fastcall GetDayOfWeek(); //取得一周的第几天AnsiString __fastcall GetWeekString(); //返回星期几的字符串protected:public:void __fastcall SetBy(int,int,int,int); //用公历设置void __fastcall SetByc(int,int,int,int); //用农历设置__fastcall ThsDivineCalendar(TComponent* Owner);//属性:年月日时__property int Year={read=FYear,write=SetYear};__property int Month={read=FMonth,write=SetMonth};__property int Day={read=FDay,write=SetDay};__property int Time={read=FTime,write=SetTime};//属性:农历年月日时__property int cYear={read=FcYear,write=SetcYear};__property int cMonth={read=FcMonth,write=SetcMonth};__property int cDay={read=FcDay,write=SetcDay};__property int cTime={read=FcTime,write=SetcTime};//公历农历日期字符串__property AnsiString DateString={read=GetDateString};__property AnsiString cDateString={read=GetcDateString};//其他属性__property TDateTime DateTime={read=TheDate,write=SetDate};__property TDateTime LastJie = { read=GetLastJie };__property TDateTime NextJie = { read=GetNextJie };__property TDateTime LastQi = { read=GetLastQi };__property TDateTime NextQi = { read=GetNextQi };__property int DayOfWeek = { read=GetDayOfWeek };__property AnsiString WeekString = { read=GetWeekString };__published:};//---------------------------------------------------------------------------#endif下面介绍转换的具体算法。
公历转农历方法
初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查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. 求出该年年初到当月之间的天数总和。
例如,假设需要换算的是2022年2月,那么该年年初到2月底有几天呢?可以通
过查看公历的日历或者使用计算工具来得到答案。
3. 计算出农历年份的年份,这一步需要根据农历年历表进行查询。
农历年份有一个十二年一个周期的循环,每个周期中的年份对应着十二生肖。
例如,2022年是中国农历中的“壬寅年”。
4. 利用农历年份的信息,可以根据农历年历表查找当年的正月初一对应的公历日期。
以正月初一为基准,加上经过的天数,就可以得到换算后的公历日期。
例如,假设2022年农历正月
初一对应的公历日期是2月1日,再加上2月份的天数,就可
以得到农历2月的公历换算结果。
需要注意的是,农历每个月的长度是不固定的,有的月份为
29天,有的月份为30天。
因此,在换算时要特别留意每个月
的天数差异。
此外,还需要注意润月的情况,有时候会出现闰月,润月会导致农历多出一个月,所以在换算时要特别注意闰月的情况。
阴历阳历转换算法
他又说:“已知二十四节气在黄道上的位置是固定的,但各年有平年和闰年之分,就使得回归年天数与实际天数不等,每年在日历上可差一天。这样可以将阴历经过任意整回归年在现在的日历上查到阳历(阳历一年相当阴历的月数为 365.2422/29.530588=12.36827个月)。例如,可先在1995年的日历上查得与(该年)阴历对应的阳历日期,这样就找到了临时落脚点,也就是找到了阴阳互换的关键。例如,可先以阴历四月初一(日)为引数,在1995年日历上查到对应的阳历为4月30日。由于已经计算出经过的月数,将经过的月数的尾数(小数)化为日,加在4月30日上,就得到经过(1995-1070)整年数的阳历日期,也就是起始阴历日期对应的阳历日期,即得到了待查的日期为4月30日加上0.64957×29.530588得到(1070年)5月19.1821840日。这样就得到了所给例子的阴阳历日期换算结果……”。
=204.2- 29.5n
然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日
2.公历换算为农历
张家骥称:“《泷冈阡表》中最末一段:‘(宋)熙宁三年,岁次庚戌四月辛酉朔,十有五日乙亥,男修表’。试算为阳历日期”。
3.计算结果的订正
Байду номын сангаас
实际上上列公历换算为农历时常有较大的误差,如熙宁三年四月初一日为公历1070年5月13日,而不是5月19日。通过中国历法所用的于支记日法求算所用两历的干支,对所求结果加以订正。
如,马依泽公生于回历310年3月20日,自回历历元起算共历日数为:
自回历元旦至其3月20日,共历79日。
0.49498 ×29.530588=14.1510,再加34,合49,干支为壬子,所得与史书所载相同。[12]因首朔再过六个月方是龙德二年六月初一日,故
农历生日和公历生日怎么换算
农历生日和公历生日怎么换算一、引言在中国,许多人在同时庆祝农历生日和公历生日。
农历生日和公历生日的换算方法让人们可以在日历上找到正确的日期,值得注意的是,两种日期的换算方法略有不同。
本文将介绍如何准确地将农历生日和公历生日进行互相转换。
二、农历生日和公历生日的基本概念1. 农历生日农历生日是根据农历的日期来确定的,通常使用农历日期的年月日表示。
较多土著族群仍以陰阳曆或传统方法調整农历日期,大多数华人社区使用農曆。
农历生日通常在传统节日(如春节)或本人出生日期庆祝。
2. 公历生日公历生日是根据一年中的365(或366)天来计算的日期,通常使用公历的年月日表示。
大多数国际社群使用公曆。
公历生日是现代社会中通用的,人们在每年的同一日期庆祝生日。
三、农历生日和公历生日的换算方法1. 公历转农历要将公历生日转换为农历生日,可通过以下步骤进行计算:•找到对应公历日期的农历年。
较广泛使用的方式是使用农历年表来进行查找,也可使用在线农历转换工具。
•根据公历出生日期在该农历年中的位置来确认农历月和日。
一般来说,计算机工具和互联网服务会提供准确的农历日期。
2. 农历转公历要将农历生日转换为公历生日,可通过以下步骤进行计算:•找到对应农历日期的公历年。
同样可使用农历年表或在线转换工具来进行查询。
•确认该农历日期在公历年中的正确位置,确定公历的月和日。
互联网工具通常会提供准确的公历日期。
四、换算示例下面举例说明一些农历和公历的转换:农历生日转公历生日假设农历生日为农历二月初五:•查遍相关年份,确认农历二月初五对应的公历日期为3月23日。
公历生日转农历生日假设公历生日为7月15日:•查询相关年份,确认7月15日对应的农历日期为六月十五。
五、总结通过以上介绍,我们可以看到,农历生日和公历生日之间的转换并不复杂,只要掌握相关的换算方法即可。
大多数人们选择在公历生日和农历生日都庆祝,以尊重传统和文化。
希望这篇文档能帮助你更好地理解农历生日和公历生日的换算方法。
阴历阳历转换算法
阴历阳历转换算法一、阳历转农历算法阳历转农历的算法可以分为两种:数学计算法和查表法。
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. 计算农历年份:农历年份的计算是通过与公历年份的差值来确定的。
农历年份与公历年份的对应关系是不固定的,需要参考农历表来确定。
一般来说,公历年份小于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年闰三月二十日。
通过这样的计算公式,我们可以方便地将公历日期转换为农历日期。
这对于一些需要参考农历的节日、纪念日等场合非常有用。
同时,也可以帮助我们更好地了解农历文化和传统。
公历转农历的函数公式
公历转农历的函数公式公历转农历是一个复杂而困难的问题,因为农历和公历是根据不同的计算方法来确定日期的。
公历是根据太阳的运行来计算日期的,而农历是根据月亮的运行来计算日期的。
农历的年份也不是按照固定的365天计算的,而是按照354或355天计算的。
因此,要将一个公历日期转换为农历日期,我们需要进行一系列的计算和推算。
以下是一个基本的公历转农历的函数公式,该公式用于计算1900年到2100年之间的公历日期对应的农历日期:1.首先,我们需要确定给定公历日期所在的年份。
公历年份可以直接从给定日期中获取。
2.接下来,我们需要确定该年的春节是在公历年份的哪一天。
春节是农历年份的第一天。
春节的日期是根据太阳历的正月初一确定的。
我们可以使用一系列的近似公式来计算春节的日期。
一般来说,春节在公历1月21日到2月20日期间。
具体的计算方法可以参考农历年份与春节日期的对照表。
3.我们还需要确定春节是农历年份的第几天。
春节是农历年份的第1天,因此我们只需要计算给定公历日期与春节之间的天数差距。
4.确定给定公历日期在农历年份中的月份和日期。
农历的月份和日期是根据月亮运行的规律来确定的。
一般来说,农历的一个月有29或30天,所以我们需要计算给定公历日期与春节之间的天数差距,并根据农历的月份长度来确定月份和日期。
以上是公历转农历的基本算法,但实际上,由于农历的计算比较复杂,还涉及到闰月、年份的起始点等问题。
因此,准确地进行公历转农历的计算需要比较复杂的算法和大量的数据。
为了减少计算量,我们通常使用一些表格和查询方法来进行公历转农历的计算。
最后,需要注意的是,公历转农历是一个多变的问题,不同地区和文化可能有不同的计算方法和规则。
因此,在写公历转农历函数时,需要根据具体的需求和文化背景进行调整和修改。
公历与农历的互换公式
修正数, 以 3 月 1 日为界, 1、 2 月为上年月份, 20 世纪的 x 9 ; 21 世纪的 x 6 。 关于月基数的求法。首先强调:农历常以 3 月 1 日为界,1、2 月属于上年月 份,记作 13 月、14 月。然后月基数 m 的查取如下表: 月份 3 0 4 31 5 1 6 32 7 2 8 33 9 4 10 34 11 5 12 35 13 6 14 37
即:2049 年为己(jǐ) 巳(sì )年。 (注:2040 能被 12 整除) 例2、 求 1984 年是农历什么年?
C 3 1984 3 解: G 1 ,为甲;而 10 10 C 3 1984 3 1 )。 Z 1 ,为子(sì 12 12 12
m 值
得日柱数 r 后,日柱干支公式为:
r G ,即日柱数的个位数 10
Z 6G r ,肯定能整除。 5
例4、 求 2049 年 10 月 1 日的日柱?
c 49 c 解: u 12 , v 1 ,查表得 m 34 ; d 1 , 21 4 4 4
公历与农历的互换公式
龙泽锋 2019.3.9 1.序 中华民国之后的中国是同时采用西方公历和本国原产农历的国家。老百姓大 多时候用的是公历,但少些时候又需要用农历。如过年,读古文和好奇时。好奇 主要是在“算命”的时候。 “算命”, 纯粹是降低中国科学水平的劣根之一, 为科学界中人所深恶痛绝的。 但农历却是中华文化精华。中国古代时,纪日除了用几月初几等方式之外,还会 用到“年柱-月柱-日柱”格式的纪日方式。今天,我就整理一下,我们如何进行公 历和农历的互换公式。 2.年柱公式 年柱的求法,比较简单。但又比月柱日柱更常用。比如说,快过年了,明年 的农历年名称是什么? 为方便,我们先规定公历中数字的代码及意义。我们知道,现在公历一般都 用 8 位数表示。如 20190310 表示 2019 年 3 月 10 日,19991001 表示 1999 年 10 月 1 日。其中前 2 位为世纪数,记作 c,3/4 位为年份数,记作 n, (或 1~4 位为 大年份数,记作 C, )5/6 位为月份数,记作 m,7/8 位为日期数,记作 d。 于是,年柱干支公式为: (记干为 G,支为 Z。 )
公历换算农历公式
公历换算农历公式
公历换算农历公式
想要将公历转换为农历,可以根据公式:公元年数—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、农历=阴历,是我国古代用来农耕的日期,也就是日历下面的小字所表示的日期。
算法不同:阳历是以地球绕太阳一周为一年所定出的历法。
农历是以太阴(月亮)绕地球为一个月,12个月为一年(闰年为13个月)所定出来的历法。
(以闰月调节年之四时)
3、农历是在阴历的基础上融合阳历成分而成的一种历法。
4、阴历是月亮历,也叫太阴历,是以月亮围绕地球转动的规律制定的。
以月球绕行地球一周为一月,即以朔望月作为确定历月的基础。
阴历的一个月叫做“朔望月”。
每月初一为朔日,十五为望日,“朔望月”是月相盈亏的平均周期。
阴历只管朔望月,不管回归年,所以和一年四季无关。
5、阳历就是太阳历,是以地球绕太阳公转的运动周期为基础而制定的历法。
一年12个月,这个“月”实际上与朔望月无关,月份、日期都与太阳在黄道上的位置较好地符合,在一年中可以明显看出四季寒暖变化的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
公历和农历转换算法详解//C51写的公历转农历和星期#define uchar unsigned char#define uint unsigned int#include <intrins.h>/*公历年对应的农历数据,每年三字节,格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期*/code uchar year_code[597] = {0x04,0xAe,0x53, //1901 00x0A,0x57,0x48, //1902 30x55,0x26,0xBd, //1903 60x0d,0x26,0x50, //1904 90x0d,0x95,0x44, //1905 120x46,0xAA,0xB9, //1906 150x05,0x6A,0x4d, //1907 180x09,0xAd,0x42, //1908 210x24,0xAe,0xB6, //19090x04,0xAe,0x4A, //19100x6A,0x4d,0xBe, //19110x0A,0x4d,0x52, //19120x0d,0x25,0x46, //19130x5d,0x52,0xBA, //19140x0B,0x54,0x4e, //19150x0d,0x6A,0x43, //19160x29,0x6d,0x37, //19170x09,0x5B,0x4B, //19180x74,0x9B,0xC1, //19190x04,0x97,0x54, //19200x0A,0x4B,0x48, //19210x5B,0x25,0xBC, //19220x06,0xA5,0x50, //19230x06,0xd4,0x45, //19240x4A,0xdA,0xB8, //19250x02,0xB6,0x4d, //19260x09,0x57,0x42, //19270x24,0x97,0xB7, //19280x66,0x4B,0x3e, //1930 0x0d,0x4A,0x51, //1931 0x0e,0xA5,0x46, //1932 0x56,0xd4,0xBA, //1933 0x05,0xAd,0x4e, //1934 0x02,0xB6,0x44, //1935 0x39,0x37,0x38, //1936 0x09,0x2e,0x4B, //1937 0x7C,0x96,0xBf, //1938 0x0C,0x95,0x53, //1939 0x0d,0x4A,0x48, //1940 0x6d,0xA5,0x3B, //1941 0x0B,0x55,0x4f, //1942 0x05,0x6A,0x45, //1943 0x4A,0xAd,0xB9, //1944 0x02,0x5d,0x4d, //1945 0x09,0x2d,0x42, //1946 0x2C,0x95,0xB6, //1947 0x0A,0x95,0x4A, //1948 0x7B,0x4A,0xBd, //1949 0x06,0xCA,0x51, //1950 0x0B,0x55,0x46, //1951 0x55,0x5A,0xBB, //1952 0x04,0xdA,0x4e, //1953 0x0A,0x5B,0x43, //1954 0x35,0x2B,0xB8, //1955 0x05,0x2B,0x4C, //1956 0x8A,0x95,0x3f, //1957 0x0e,0x95,0x52, //1958 0x06,0xAA,0x48, //1959 0x7A,0xd5,0x3C, //1960 0x0A,0xB5,0x4f, //1961 0x04,0xB6,0x45, //1962 0x4A,0x57,0x39, //1963 0x0A,0x57,0x4d, //1964 0x05,0x26,0x42, //1965 0x3e,0x93,0x35, //1966 0x0d,0x95,0x49, //1967 0x75,0xAA,0xBe, //1968 0x05,0x6A,0x51, //1969 0x09,0x6d,0x46, //1970 0x54,0xAe,0xBB, //1971 0x04,0xAd,0x4f, //19720x4d,0x26,0xB7, //19740x0d,0x25,0x4B, //19750x8d,0x52,0xBf, //19760x0B,0x54,0x52, //19770x0B,0x6A,0x47, //19780x69,0x6d,0x3C, //19790x09,0x5B,0x50, //19800x04,0x9B,0x45, //19810x4A,0x4B,0xB9, //19820x0A,0x4B,0x4d, //19830xAB,0x25,0xC2, //19840x06,0xA5,0x54, //19850x06,0xd4,0x49, //19860x6A,0xdA,0x3d, //19870x0A,0xB6,0x51, //19880x09,0x37,0x46, //19890x54,0x97,0xBB, //19900x04,0x97,0x4f, //19910x06,0x4B,0x44, //19920x36,0xA5,0x37, //19930x0e,0xA5,0x4A, //19940x86,0xB2,0xBf, //19950x05,0xAC,0x53, //19960x0A,0xB6,0x47, //19970x59,0x36,0xBC, //19980x09,0x2e,0x50, //1999 294 0x0C,0x96,0x45, //2000 297 0x4d,0x4A,0xB8, //20010x0d,0x4A,0x4C, //20020x0d,0xA5,0x41, //20030x25,0xAA,0xB6, //20040x05,0x6A,0x49, //20050x7A,0xAd,0xBd, //20060x02,0x5d,0x52, //20070x09,0x2d,0x47, //20080x5C,0x95,0xBA, //20090x0A,0x95,0x4e, //20100x0B,0x4A,0x43, //20110x4B,0x55,0x37, //20120x0A,0xd5,0x4A, //20130x95,0x5A,0xBf, //20140x04,0xBA,0x53, //20150x0A,0x5B,0x48, //20160x05,0x2B,0x50, //2018 0x0A,0x93,0x45, //2019 0x47,0x4A,0xB9, //2020 0x06,0xAA,0x4C, //2021 0x0A,0xd5,0x41, //2022 0x24,0xdA,0xB6, //2023 0x04,0xB6,0x4A, //2024 0x69,0x57,0x3d, //2025 0x0A,0x4e,0x51, //2026 0x0d,0x26,0x46, //2027 0x5e,0x93,0x3A, //2028 0x0d,0x53,0x4d, //2029 0x05,0xAA,0x43, //2030 0x36,0xB5,0x37, //2031 0x09,0x6d,0x4B, //2032 0xB4,0xAe,0xBf, //2033 0x04,0xAd,0x53, //2034 0x0A,0x4d,0x48, //2035 0x6d,0x25,0xBC, //2036 0x0d,0x25,0x4f, //2037 0x0d,0x52,0x44, //2038 0x5d,0xAA,0x38, //2039 0x0B,0x5A,0x4C, //2040 0x05,0x6d,0x41, //2041 0x24,0xAd,0xB6, //2042 0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0A,0x4B,0x51, //2045 0x0A,0xA5,0x46, //2046 0x5B,0x52,0xBA, //2047 0x06,0xd2,0x4e, //2048 0x0A,0xdA,0x42, //2049 0x35,0x5B,0x37, //2050 0x09,0x37,0x4B, //2051 0x84,0x97,0xC1, //2052 0x04,0x97,0x53, //2053 0x06,0x4B,0x48, //2054 0x66,0xA5,0x3C, //2055 0x0e,0xA5,0x4f, //2056 0x06,0xB2,0x44, //2057 0x4A,0xB6,0x38, //2058 0x0A,0xAe,0x4C, //2059 0x09,0x2e,0x42, //20600x0C,0x96,0x49, //20620x7d,0x4A,0xBd, //20630x0d,0x4A,0x51, //20640x0d,0xA5,0x45, //20650x55,0xAA,0xBA, //20660x05,0x6A,0x4e, //20670x0A,0x6d,0x43, //20680x45,0x2e,0xB7, //20690x05,0x2d,0x4B, //20700x8A,0x95,0xBf, //20710x0A,0x95,0x53, //20720x0B,0x4A,0x47, //20730x6B,0x55,0x3B, //20740x0A,0xd5,0x4f, //20750x05,0x5A,0x45, //20760x4A,0x5d,0x38, //20770x0A,0x5B,0x4C, //20780x05,0x2B,0x42, //20790x3A,0x93,0xB6, //20800x06,0x93,0x49, //20810x77,0x29,0xBd, //20820x06,0xAA,0x51, //20830x0A,0xd5,0x46, //20840x54,0xdA,0xBA, //20850x04,0xB6,0x4e, //20860x0A,0x57,0x43, //20870x45,0x27,0x38, //20880x0d,0x26,0x4A, //20890x8e,0x93,0x3e, //20900x0d,0x52,0x52, //20910x0d,0xAA,0x47, //20920x66,0xB5,0x3B, //20930x05,0x6d,0x4f, //20940x04,0xAe,0x45, //20950x4A,0x4e,0xB9, //20960x0A,0x4d,0x4C, //20970x0d,0x15,0x41, //20980x2d,0x92,0xB5, //2099};///月份数据表code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; code uint day_code2[3]={0x111,0x130,0x14e};/*调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据*/bit c_moon;data uchar year_moon,month_moon,day_moon,week;/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/bit get_moon_day(uchar month_p,uint table_addr){uchar temp;switch (month_p){case 1:{temp=year_code[table_addr]&0x08;if (temp==0)return(0);else return(1);}case 2:{temp=year_code[table_addr]&0x04;if (temp==0)return(0);else return(1);}case 3:{temp=year_code[table_addr]&0x02;if (temp==0)return(0);else return(1);}case 4:{temp=year_code[table_addr]&0x01;if (temp==0)return(0);else return(1);}case 5:{temp=year_code[table_addr+1]&0x80;if (temp==0) return(0);else return(1);}case 6:{temp=year_code[table_addr+1]&0x40;if (temp==0)return(0);else return(1);}case 7:{temp=year_code[table_addr+1]&0x20;if (temp==0)return(0);else return(1);}case 8:{temp=year_code[table_addr+1]&0x10;if (temp==0)return(0);else return(1);}case 9:{temp=year_code[table_addr+1]&0x08;if (temp==0)return(0);else return(1);}case 10:{temp=year_code[table_addr+1]&0x04;if (temp==0)return(0);else return(1);}case 11:{temp=year_code[table_addr+1]&0x02;if (temp==0)return(0);else return(1);}case 12:{temp=year_code[table_addr+1]&0x01;if (temp==0)return(0);else return(1);}case 13:{temp=year_code[table_addr+2]&0x80;if (temp==0)return(0);else return(1);}}}/*调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据*/void Conversion(bit c,uchar year,uchar month,uchar day){ //c=0 为21世纪,c=1 为19世纪输入输出数据均为BCD数据uchar temp1,temp2,temp3,month_p;uint temp4,table_addr;bit flag2,flag_y;temp1=year/16; //BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2;//定位数据表地址if(c==0){table_addr=(year+0x64-1)*0x3;}else{table_addr=(year-1)*0x3;}//定位数据表地址完成//取当年春节所在的公历月份temp1=year_code[table_addr+2]&0x60;temp1=_cror_(temp1,5);//取当年春节所在的公历月份完成//取当年春节所在的公历日temp2=year_code[table_addr+2]&0x1f;//取当年春节所在的公历日完成// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月if(temp1==0x1){temp3=temp2-1;}else{temp3=temp2+0x1f-1;}// 计算当年春年离当年元旦的天数完成//计算公历日离当年元旦的天数,为了减少运算,用了两个表//day_code1[9],day_code2[3]//如果公历月在九月或前,天数会少于0xff,用表day_code1[9],//在九月后,天数大于0xff,用表day_code2[3]//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1//如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1if (month<10){temp4=day_code1[month-1]+day-1;}else{temp4=day_code2[month-10]+day-1;}if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1temp4+=1;}//计算公历日离当年元旦的天数完成//判断公历日在春节前还是春节后if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算temp4-=temp3;month=0x1;month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月flag2=get_moon_day(month_p,table_addr);//检查该农历月为大小还是小月,大月返回1,小月返回0flag_y=0;if(flag2==0)temp1=0x1d; //小月29天else temp1=0x1e; //大小30天temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月while(temp4>=temp1){temp4-=temp1;month_p+=1;if(month==temp2){flag_y=~flag_y;if(flag_y==0)month+=1;}else month+=1;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp4+1;}else{ //公历日在春节前使用下面代码进行运算temp3-=temp4;if (year==0x0){year=0x63;c=1;}else year-=1;table_addr-=0x3;month=0xc;temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4);if (temp2==0)month_p=0xc;elsemonth_p=0xd; ///*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/ flag_y=0;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1){temp3-=temp1;month_p-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp1-temp3+1;}c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_moon=temp1|temp2;temp1=month/10;temp1=_crol_(temp1,4);temp2=month%10;month_moon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_moon=temp1|temp2;}/*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun)如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪调用函数后,原有数据不变,读week得出阴历BCD数据*/code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表/*算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在闰年又不到3 月份上述之和要减一天再除7星期数为0*/void Conver_week(bit c,uchar year,uchar month,uchar day){//c=0 为21世纪,c=1 为19世纪输入输出数据均为BCD数据uchar temp1,temp2;temp1=year/16; //BCD->hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2;if (c==0){year+=0x64;} //如果为21世纪,年份数加100temp1=year/0x4; //所过闰年数只算1900年之后的temp2=year+temp1;temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据temp2=temp2+day+table_week[month-1];if (year%0x4==0&&month<3)temp2-=1;week=temp2%0x7;}//testuchar c_sun,year_sun,month_sun,day_sun;void main(){c_sun=1;year_sun=0x2;month_sun=0x11;day_sun=0x3;Conver_week(c_sun,year_sun,month_sun,day_sun);Conversion(c_sun,year_sun,month_sun,day_sun);while(1);}算法一:公历转农历============================================================================ /*------------农历转换函数-----------*/char *GetDayOf(PSYSTEMTIME pSt){/*天干名称*/const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};/*地支名称*/const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};/*属相名称*/const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};/*农历日期名*/const char *cDayName[] = {"*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十"};/*农历月份名*/const char *cMonName[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};/*公历每月前面的天数*/const int wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};/*农历数据*/const int wNongliData[100] = {2635,333387,1701,1748,267701,694,2391,133423,1175,396438 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402,400202,2901,1386,267611,605,2349,137515,2709,464533,1738,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,268949,3402,3493,133973,1386,464219,605,2349,334123,2709,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};static int wCurYear,wCurMonth,wCurDay;static int nTheDate,nIsEnd,m,k,n,i,nBit;TCHAR szNongli[30], szNongliDay[10],szShuXiang[10];/*---取当前公历年、月、日---*/wCurYear = pSt->wYear;wCurMonth = pSt->wMonth;wCurDay = pSt->wDay;/*---计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)---*/nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd[wCurMonth - 1] - 38;if((!(wCurYear % 4)) && (wCurMonth > 2))nTheDate = nTheDate + 1;/*--计算农历天干、地支、月、日---*/nIsEnd = 0;m = 0;while(nIsEnd != 1){if(wNongliData[m] < 4095)k = 11;elsek = 12;n = k;while(n>=0){//获取wNongliData(m)的第n个二进制位的值nBit = wNongliData[m];for(i=1;i<n+1;i++)nBit = nBit/2;nBit = nBit % 2;if (nTheDate <= (29 + nBit)){nIsEnd = 1;break;}nTheDate = nTheDate - 29 - nBit;n = n - 1;}if(nIsEnd)break;m = m + 1;}wCurYear = 1921 + m;wCurMonth = k - n + 1;wCurDay = nTheDate;if (k == 12){if (wCurMonth == wNongliData[m] / 65536 + 1)wCurMonth = 1 - wCurMonth;else if (wCurMonth > wNongliData[m] / 65536 + 1)wCurMonth = wCurMonth - 1;}/*--生成农历天干、地支、属相==> wNongli--*/wsprintf(szShuXiang,"%s",cShuXiang[((wCurYear - 4) % 60) % 12]);wsprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear - 4) % 60) % 10],cDiZhi[((wCurYear - 4) % 60) % 12]);/*--生成农历月、日==> wNongliDay--*/if (wCurMonth < 1)wsprintf(szNongliDay,"闰%s",cMonName[-1 * wCurMonth]);elsestrcpy(szNongliDay,cMonName[wCurMonth]);strcat(szNongliDay,"月");strcat(szNongliDay,cDayName[wCurDay]);return strcat(szNongli,szNongliDay);}============================================================================首先,我们要确定一个时刻,作为一天的起点(包括这个时刻)。