公历转农历
公历转农历为方便叙述,首先介绍两个函数高斯函数:f(x)=[x],[x]表示不超过数x的最大整数,那么对数x进行取整有三种方法:用高斯函数分别表示为去尾法取整f(x)=[x];进一法取整f(x)=-[-x];四舍五入法取整f(x)=[x+0.5].求余数函数:f(x)=xmodt,表示x除以t后所得的余数(即mod表示余数运算)且被除数x=除数t*商+余数,所以有x=t*[x/t]+xmodt如果以某年的1月1日为这一年第1天,那么这一年2月1日就是第32天……如果设月份数为m,日期数为d,求m月d日是这一年的第几天(即这一天的序数),这也容易算出,但能否给出个公式,把m,d代入公式直接求出序数g(m,d)呢?下面来推导这个公式:要求出序数g(m,d)只需把日期d加上这个月之前各月天数的总和g(m)即可,比如说求1月份某日序数,把日期加0即可,求2月份某日序数,把日期加31即可……容易得出平年和闰年的1-12月份的月前天数总和g(m)分别是:月份``m` ,1,`2,`3,`4,``5,``6,``7,``8,``9,`10,`11,`12。
平年g(m),0,31,59,90,120,151,181,212,243,273,304,334。
闰年g(m),0,31,60,91,121,152,182,213,244,274,305,335。
下面来求这个月前天数总和g(m)的表达式,假设(1)如果一年中的每个月都是30天,很容易得出月前天数总和g(m)为30m-30,假设(2)如果一年中的单月都是31天,双月都是30天,月前天数总和比假设(1)每个双月多一天,在假设(1)基础加[m/2],(即对m/2取整)即可以得出这种情况下g(m)为30m+[m/2]-30,假设(3)如果一年中8月以前的单月都是31天,双月都是30天,并且8月及其以后的单月都是30天,双月都是31天,月前天数总和比假设(2)中9月份及其以后每个月多一天,在假设(2)基础加[m/9],即可以得出这种情况下g(m)为30m+[m/2]+[m/9]-30,假设(3)跟实际情况已经很接近了,只差2月份的天数不同,先考虑平年时的情况,2月份是28天,比假设(3)中少两天,所以当m=1,2时g(m)为30m+[m/2]+[m/9]-30,当m≥3时,g(m)为30m+[m/2]+[m/9]-30-2=30m+[m/2]+[m/9]-32,可以用式子[2/m]和[1/m]把m=1,2时的情况化到上式当中,即得平g(m)=30m+[m/2]+[m/9]-32+([2/m]-[1/m])*2,由此还可得闰年时闰g(m)=30m+[m/2]+[m/9]-31+([2/m]-[1/m]),设年份数为y,所以这个g(m)的统一式还和y有关。
前面已定义f(x)=xmodt表示x除以t后所得的余数,则闰年的条件可以这样来表述:已知当ymod4=0且ymod100≠0或ymod400=0时,y年才为闰年,由开篇介绍可知对(ymodt)/t用进一法取整表达式为-[-(ymodt)/t],其含义为当ymodt=0时,-[-(ymodt)/t]=0;当ymodt≠0时,-[-(ymodt)/t]=1,再由开篇x=t*[x/t]+xmodt可得-[-(ymodt)/t]=-[[y/t]-y/t],令m(y)=-[[y/4]-y/4]+[[y/100]-y/100]-[[y/400]-y/400],那么可以得出当y年是闰年时,m(y)=0,当y年不是闰年时,m(y)=1,以上几式都可以用讨论的方法加以证明,证明从略。
将m(y)应用到上面的g(m)式中,可以得到g(m)的统一式:g(m)=30m+[m/2]+[m/9]-31-m(y)+([2/m]-[1/m])*(1+m(y)),所以g(m,d)=g(m)+d=30m+[m/2]+[m/9]-31-m(y)+([2/m]-[1/m])*(1+m(y))+d。
假设从公元前一年到现在的历法都是现行历法(格里高利历法),即公历置闰方法未变,都是4年一闰且100年不闰400年又闰,实际没有公元0年,现在假设有公元0年,并把公元0年1月1日设为第1天(序数为1),那么公元1年1月1日就是第367天(序数为367)……但能否给出个公式g(y,m,d),把y,m,d代入公式直接求y年m月d日这一天的序数呢?下面来推导这个公式:要求出序数g(y,m,d)只需把g(m,d)加上这一年之前的天数总和g(y),假设(1)如果每年都是365天,很容易得出某一年之前的天数总和g(y)为365y,假设(2)如果每4年一闰,即每4k+1的年份的序数都比假设(1)多一天,由此可以得出g(y)为365y+[(y-1)/4]+1=365y+[y/4]-[[y/4]-y/4][(y-1)/4]+1=[y/4]-[[y/4]-y/4]可以用讨论的方法加以证明由此可以得到g(y)的表达式为g(y)=365y+[y/4]-[[y/4]-y/4]-[y/100]+[[y/100]-y/100]+[y/400]-[[y/400]-y/400],上面有m(y)=-[[y/4]-y/4]+[[y/100]-y/100]-[[y/400]-y/400],所以g(y)=365y+[y/4]-[y/100]+[y/400]+m(y),g(y,m,d)=365y+[y/4]-[y/100]+[y/400]+m(y)+g(m)+d,g(y,m,d)=365y+[y/4]-[y/100]+[y/400]+30m+[m/2]+[m/9]-31+([2/m]-[1/m])*(1+m(y))+d。
根据这个式子很容易求出任意两天之间相差的天数是多少,即分别求出两天的序数之后作差即可。
为方便计算,下面来化简这个式子设公元y年m月d日(y≥1582且y+m/10≥1583且y+m+d/15≥1593,1≤m≤12)设公元y年年份的末两位数为b(b=y-[y/100]),年份去掉末两位数后剩下的数为a(a=[y/100]),即有y=100a+b。
设f(y)=365y+[y/4]-[y/100]+[y/400],将y=100a+b代入式中得f(y)=36500a+365b+[25a+b/4]-[a+b/100]+[a/4+b/400]b为年份的末两位数,所以0≤b<100,所以[b/100]=0,b/400<1/4,用讨论的方法(设a=4k+0,1,2,3)可以证明[a/4+b/400]=[a/4],所以f(y)=36500a+365b+25a+[b/4]-a+[a/4],f(y)=36524a+[a/4]+365b+[b/4],所以g(y,m,d)=36524a+[a/4]+365b+[b/4]+30m+[m/2]+[m/9]-31+([2/m]-[1/m])*(1+m(y))+d。
设f(m)=30m+[m/2]+[m/9]+([2/m]-[1/m])*(1+m(y))+ε,(ε为一待定常数项)设f(y,m,d)=f(y)+f(m)+d,则f(y,m,d)=36524a+[a/4]+365b+[b/4]+30m+[m/2]+[m/9]+([2/m]-[1/m])*(1+m(y))+ε+d,则f(y,m,d)就是公元y年m月d日一个相对的序数,如果以某个历法周期p为模(除数),对进行求余数运算就可以求出某一天的是这个周期的哪一天了,(1)如果以7为模,就可以求某一天星期几,f(y,m,d)≡36524a+[a/4]+365b+[b/4]+f(m)+d (mod7),≡5a+[a/4]+b+[b/4]+2m+[m/2]+[m/9]+([2/m]-[1/m])*(1+m(y))+ε+d (mod7),然后对照历书就可以得出ε的值,在这里f(m)是以公式的形式给出的,如果能直接记住每个月f(m)(mod7)的值,会使计算更加快捷的,总之记的数据越多,算起来越快。
(2)如果以60为模,就可以求公历某年某月某日的干支序数,f(y,m,d)≡36524a+[a/4]+365b+[b/4]+f(m)+d (mod60),f(y,m,d)≡44a+[a/4]+5b+[b/4]+f(m)+d (mod60),f(y,m,d)≡4*((11*(amod15))mod15)+[a/4]+5*bmod12+[b/4]+f(m)+d (mod60),1-12月对应的f(m)的余数分别对应10,41,9,40,10,41,11,42,13,43,14,44;闰年的1,2月份要减去1,最后求出的结果1-59分别对应干支甲子-壬戌,0对应癸亥,即求出的结果用10除求余数,余数为0-9时分别对应天干:癸甲乙丙丁戊己庚辛壬,求出的结果用12除求余数,余数为0-11时分别对应地支:亥子丑寅卯辰巳午未申酉戌亥,当a=19时,44a+[a/4]≡0(mod60);当a=20时,44a+[a/4]≡45(mod60);记住世纪的余数0和45就能很快算出上下100年某天的干支了,如1949年10月1日干支序数为0+5*49mod12+[49/4]+43+1≡5+12+43+1≡61≡1(mod60),所以新中国成立的这一天是甲子日!再如2006年10月1日干支序数为45+5*6+[6/4]+43+1≡15+1+43+1≡0(mod60),所以这一天是癸亥日,也可以不用60作模,而分别用10和12作模对f(y,m,d)求余数,需要计算两次才能求出干支,不知道这两种算法哪一种快,我还没有比较过。
(3)如果以28为模,就可以求某日对应的廿八宿,当然廿八宿也可以根据星期和干支用中国剩余定理算出来。
(4)如果以29.5306为模,则可以比较精确的估计出公历某年某月某日的农历日期,f(y,m,d)≡36524a+[a/4]+365b+[b/4]+f(m)+d (mod29.5306),≡[a/4]-5.3522a+10.6328b+[b/4]+0.4694m+[m/2]+[m/9]+([2/m]-[1/m])*(1+m(y))+ε+d(mod29.5306) 据说目前还没有把公历转换成农历的公式,我想上面这个公式应该算是把公历转换成农历的公式了,如果把ε取一恰当的值,再把所得的结果四舍五入,也许会得到农历日期的精确值,这需要计算来验证,粗略算了一下,2000年的ε值在6.0134和6.0746之间,如果得不到农历日期的精确值,我猜想ε对于每年都是不同的值,并且ε是年份y的函数,如果也不成立的话,就需要换成更精确的周期29.53058867+0.0000000019(y-1900)来支持了,计算起来更为麻烦,不过用计算机算起来也许很快,只是我不会编程,暂时没法验证。
小学历史换算公式大全
小学历史换算公式大全1. 公历与农历互转
公历转农历
公历年份 Y 转农历年份 L 的计算公式:L = Y + 2697
农历转公历
农历年份 L 转公历年份 Y 的计算公式:Y = L - 2697 2. 年代换算
公元年份转纪年
公元年份 A.D. 转纪年计算公式:纪年 = A.D. + 2697
纪年转公元年份
纪年转公元年份 A.D. 计算公式:A.D. = 纪年 - 2697 3. 时代转换
公元年份转朝代
公元年份 A.D. 转朝代计算公式:朝代 = (A.D. - 2697) / 68 + 1
朝代转公元年份
朝代转公元年份 A.D. 计算公式:A.D. = (朝代 - 1) * 68 + 2697
4. 世纪与年份转换
世纪转年份
世纪 J 转年份计算公式:年份 = (J - 1) * 100 + 1
年份转世纪
年份转世纪 J 计算公式:J = (年份 + 99) / 100
5. 过去与未来年份换算
过去年份换算为现在
过去年份 P 转现在年份 C 计算公式:C = P + (当前年份 - 当前年份的世纪起始年)
未来年份换算为现在
未来年份 F 转现在年份 C 计算公式:C = F - (当前年份 - 当前年份的世纪起始年)
以上是小学历史换算公式的大全,希望对您有所帮助!。
excel公历转农历的四种方法
excel公历转农历的四种方法excel公历转农历方法一:使用text函数A列是公历日期,我们在B1单元格输入公式:=TEXT(A1,"[$-130000]yyyy年m月"&I F(LEN(--TEXT(A1,"[$-130000]dd"))=1,"初","")&"d"),下拉完成公历转农历。
excel公历转农历方法二:使用text+MID函数A列仍然是公历,B1输入公式:=MID("甲乙丙丁戊己庚辛壬癸",MOD(TEXT(A1,"[$-13 0000]e")-4,10)+1,1)&MID("子丑寅卯辰巳午未申酉戌亥",MOD(TEXT(A1,"[$-130000]e")-4, 12)+1,1)&"年"&TEXT(A1,"[$-130000][DBNum1]m月d日"即可。
excel公历转农历方法三:使用text+MID+ CHOOSE+ YEAR函数A1为公历,B1输入:=CHOOSE(MOD(YEAR(A1)-1900,10)+1,"庚","辛","壬","癸","甲", "乙","丙","丁","戊","己")&CHOOSE(MOD(YEAR(A1)-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A1,"[dbnum1][$-130000]年m月"&IF(--TEXT(A1, "[$-130000]d")<11,"初","")&TEXT(A1,"[dbnum1][$-130000]d"))excel公历转农历方法四:使用自定义函数上面介绍的excel公历转农历都是使用excel内置函数完成的,有一个弊端就是公式太长,如果使用自定义函数,在公式栏就可以简化输入。
最新最准公历和农历转换算法详解
最新最准公历和农历转换算法详解公历(阳历)和农历(阴历)是中国传统的两种历法,公历采用太阳历,以地球绕太阳运行为基础,而农历是以月球运行为基础。
公历更准确地反映了太阳运行的变化,而农历则更加贴近农业生产和民俗习俗的需求。
公历和农历之间的转换涉及到一个重要的问题,即如何确定其中一年是闰年还是平年,以及每个月有多少天。
因为农历中的月份天数不规则,而公历中的月份天数相对固定。
最准确的公历和农历转换算法是以历法的数学及历史研究为基础的,它考虑了太阳和月球的运行轨迹,以及历法制订时的政治和文化背景等方面,下面详细介绍这个算法。
1.公历转农历:公历转农历的核心问题是确定其中一年闰月的位置和天数。
一般而言,公历转农历的过程如下:(1)确定公历年份。
(2)根据公历年份的规则,计算闰年的次数。
公历规定,4年一闰,100年不闰,400年又要闰。
因此,可以通过一系列的除法和取余运算,判断其中一年是否是闰年。
(3)确定农历年份。
根据闰年的次数,可以推算其中一年距离公元前一年农历年份的偏移量。
再加上历史上确定的一个公历对应农历年份的偏移量,即可确定农历年份。
(4)确定农历月份。
根据农历月份的规则,即按照一定的数学计算公式,可以确定其中一年的闰月位置。
具体的算法很复杂,涉及到太阳、月球的轨迹计算,需要使用较为复杂的数学运算方法,如三角函数等。
(5)确定农历日期。
在确定了农历月份的基础上,根据农历每个月的天数规则,可以确定其中一天的农历日期。
2.农历转公历:农历转公历也面临着确定闰年的问题。
农历转公历的过程如下:(1)确定农历年份和月份。
根据农历日期,确定农历当前年份和月份。
(2)根据农历年份的规则,计算闰年的次数。
农历中的闰年规则和公历中的规则略有不同,需要根据历史数据和规则进行计算。
(3)确定公历年份。
根据农历年份和闰年的次数,可以推算其中一年距离公元前一年公历年份的偏移量。
再加上历史上确定的一个农历对应公历年份的偏移量,即可确定公历年份。
excel公历转农历的四种方法
excel公历转农历的四种方法excel公历转农历方法一:使用text函数A列是公历日期,我们在B1单元格输入公式:=TEXT(A1,"[$-130000]yyyy年m月"&I F(LEN(--TEXT(A1,"[$-130000]dd"))=1,"初","")&"d"),下拉完成公历转农历。
excel公历转农历方法二:使用text+MID函数A列仍然是公历,B1输入公式:=MID("甲乙丙丁戊己庚辛壬癸",MOD(TEXT(A1,"[$-13 0000]e")-4,10)+1,1)&MID("子丑寅卯辰巳午未申酉戌亥",MOD(TEXT(A1,"[$-130000]e")-4, 12)+1,1)&"年"&TEXT(A1,"[$-130000][DBNum1]m月d日"即可。
excel公历转农历方法三:使用text+MID+ CHOOSE+ YEAR函数A1为公历,B1输入:=CHOOSE(MOD(YEAR(A1)-1900,10)+1,"庚","辛","壬","癸","甲", "乙","丙","丁","戊","己")&CHOOSE(MOD(YEAR(A1)-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A1,"[dbnum1][$-130000]年m月"&IF(--TEXT(A1, "[$-130000]d")<11,"初","")&TEXT(A1,"[dbnum1][$-130000]d"))excel公历转农历方法四:使用自定义函数上面介绍的excel公历转农历都是使用excel内置函数完成的,有一个弊端就是公式太长,如果使用自定义函数,在公式栏就可以简化输入。
阴历阳历转换计算公式
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周年国庆)是星期五。
公历与农历的转换方法
公历与农历的转换方法包括但不限于以下几种:
查表法:通过查询预先编制的表格来获得对应的日期。
这种方法简单易行,但需要保证表格的准确性。
公式法:利用特定的数学公式进行转换。
这种方法需要掌握一定的数学基础,但可以快速准确地完成转换。
软件法:使用农历转公历的转换软件,这种方法简单易用,适合普通用户。
在线转换工具:现在有很多在线的农历转换工具可以使用,例如中国日历网、万年历网等,只需要输入公历的日期和时间,就可以得到对应的农历日期和时间。
使用农历转公历的转换器,也可以实现转换,操作相对简单。
以上方法各有特点,可以根据实际情况选择合适的方法进行转换。
需要注意的是,由于农历和公历的历法基础不同,转换过程中可能会存在误差,因此转换结果仅供参考,实际应用时需谨慎对待。
公历转换农历及节气算法
公历转换农历公历与农历是我国目前并存的两种历法,各有其固有的规律,农历与月球的运行相对应,其影响因素多,它的大小月和闰月与天体运行有关,计算十分复杂,且每年都不一致,因此要用单片机实现公历与农历的转换用查表法是最方便实用的办法。
计算公历日对应的农历日期的方法是先计算出公历日离当年元旦的天数,然后查表取得当年的春节日期,计算出春节离元旦的天数,二者相减即可算出公历日离春节的天数,以后只要根据大小月和闰月信息减一月天数,调整一月农历月份,即可推算出公历日所对应的农历日期,如公历日不到春节日期,农历年要比公历年小一年,农历大小月取前一年的信息,农历月从12 月向前推算。
本文介绍的公历转换农历C语言程序实现从1901 年到2099 年199 年的公历日到农历转换,如果到2099年后则要添加农历表,但我相信199年对我们现代人已经足够了。
在功能函数入口输入BCD公历数据函数出口直接输出BCD农历数据。
农历显示按照人为习惯都是用大写显示,比如:“1号”应该显示为’初一“;“21”应该显示为“廿一”;“12月”应该显示为“腊月”等。
二十四节气和生肖二十四节气是我国劳动人民创造的辉煌文化,它能反映季节的变化,指导农事活动,影响着千家万户的衣食住行。
有人认为二十四节气从属农历,其实,它是根据阳历划定的。
即根据太阳在黄道上的位置,把一年划分为24个彼此相等的段落。
也就是把黄道分成24个等份,每等份各占黄经15°。
由于太阳通过每等份所需的时间几乎相等,二十四节气的公历日期每年大致相同:上半年在6日、21日前后,下半年在8日、23日前后。
二十四节气没有固定规律,也需要存表。
如1901年的节气为:1月2月3月4月5月6月 7月 8月 9月 10月 11月 12月[ 6,21][ 4,19][ 6,21][ 5,21][ 6,22][ 6,22][ 8,23][ 8,24][ 8,24][ 8,24][ 8,23][ 8,22][ 9, 6][11, 4][ 9, 6][10, 6][ 9, 7][ 9, 7][ 7, 8][ 7, 9][ 7, 9][ 7, 9][ 7, 8][ 7,15]上面第一行数据为每月节气对应公历日期,15减去每月第一个节气,每月第二个节气减去15得第二行,这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据,根据以上规律便可编写出节气表,最后通过表计算出每月节气。
公历转换成农历c语言函数
公历转换成农历c语言函数公历和农历是两种不同的历法系统,公历是以太阳运行为基础的历法,而农历则是以月亮运行为基础的历法。
在某些应用中,我们可能需要将公历日期转换成农历日期。
下面是一个用C语言编写的函数,可以实现公历转换成农历的功能。
```c#include <stdio.h>// 农历数据结构typedef struct {int year; // 农历年份int month; // 农历月份int day; // 农历日期} LunarDate;// 公历转农历函数LunarDate convertToLunar(int year, int month, int day) {// 农历数据表,省略部分数据int lunarData[100] = {// 农历数据表};// 公历转农历的算法,省略具体实现LunarDate lunarDate;lunarDate.year = 2022; // 假设转换结果为2022年农历 lunarDate.month = 1; // 假设转换结果为1月lunarDate.day = 1; // 假设转换结果为1日return lunarDate;}int main() {int year, month, day;printf("请输入公历日期(年月日):");scanf("%d %d %d", &year, &month, &day);LunarDate lunarDate = convertToLunar(year, month, day);printf("农历日期:%d年%d月%d日\n", lunarDate.year, lunarDate.month, lunarDate.day);return 0;}```上述代码中,我们定义了一个`LunarDate`结构体,用于存储农历日期。
