阴历阳历转换计算公式
阴历阳历转换计算公式
1.阴历阳历的转换不同
阴历和阳历是两种不同的日历,其中阴历是按照太阳和月亮的运行轨迹,按照太阳来计算日期的日历,而阳历是按照地球绕太阳公转一周来计
算日期的日历,因此两者的转换要求也有所不同。
2.基本原理
阴历日期的转换要求基于以下原理:以中国唐朝为基准,一年共有
354/355天,每2~3年有1年闰,即365天,农历每年分12个月,有大
小月之分,每个月又按30、29两种不同的天数计算,其中大月30天,小
月29天,定朔月以节令月为基准(每4年更换节令月),每个月节令月
称为“正月”。
阳历日期的转换要求基于以下原理:一年有365天,闰年有366天,
每月有28天到31天,共12个月,而每个月的天数是固定的,故可以按
照这个原理进行转换。
3.转换公式
由于阴历和阳历日期的计算方式有所不同,所以转换公式也有所不同。
阴历转换为阳历时,公式如下:
N=(N+2)/3
其中,N=农历月,若N不满三位数,则用0补齐;如N=5,则N=005;
将结果作为农历的节令月,即可求得是阳历哪一月;
同时,节令月的1号即是阳历日期;
反之,阳历转换为阴历时,公式如下:
N=(N-1)*3+2
由于农历每个月只有29或者30天,即农历的节令月只有29号或者30号。
农历运算
一年中哪个月大,哪个月小,年年不同,由计算决定。
一般的,在19年里中设置7个闰月,有闰月的年份全年383天或384天。
1.公历转换农历的算法公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。
比较常用并且比较简单的公历转换农历算法就是查表方法。
首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来(在我的C++类中,是从1900年作为起点的。
选择一个起始点的思想十分重要,在下面的干支纪法和二十四节气中也体现到了)。
回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。
那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。
如何简化呢?要保存一年的信息,其实只要两个信息就可以了:(1)、农历每个月的大小;(2//今年是否有闰月,闰几月以及闰月的大小。
用一个整数来保存这些信息就足够了。
具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉了12位,再用低四位来表示闰月的月份,没有闰月记为0。
比如说,2000年的信息数据是0x0c960,转化成二进制就是1100100101100000,表示的含义是1、2、5、8、10、11月大,其余月小,低四位为0说明没有闰月。
2001年的农历信息数据是0x0d954,其中的4表示该年闰4月,月份大小信息就是0x0d95,具体的就是1、2、4、5、8、10、12月大,其余月小。
这样就可以用一个数组来保存这些信息。
在我的C++类中是用m_lunarInfo这个数组来保存这些信息的。
下面就是公历转换成农历的具体算法:(1) 计算所求时间到起始年正月初一的天数。
(2) 从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止。
阴历阳历转换计算公式
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. 检查是否为闰年,闰年的判断规则是:公历年份能够被4整除但不能被100整除,或者能够被400整除的年份为闰年。
如果待转换的年份是闰年,则在后面的步骤中月份的天数需要进行调整。
3. 农历每年的正月初一对应的阳历日期不同,所以需要首先确定农历某一年对应的正月初一的阳历日期。
- 可以查找一些农历和阳历的对应表,查找待转换的年份对应的正月初一的阳历日期。
- 也可以使用一些公式进行计算,但比较复杂,具体公式可以在一些相关书籍或网站中查找。
4. 在确定了农历的正月初一对应的阳历日期之后,就可以根据待转换的阳历日期和正月初一的阳历日期进行计算,得出对应的农历日期。
接下来,我们来看农历转阳历的方法。
农历转阳历主要涉及到年份、月份和日期的转换。
具体步骤如下:1. 首先确定待转换的农历日期,包括年份、月份和日期。
2. 首先确定转换的年份是否为闰年,闰年的判断方法同上述阳历转农历中的判断方法。
3. 确定农历某一年对应的正月初一的阳历日期。
4. 根据待转换的农历日期和正月初一的阳历日期进行计算,得出对应的阳历日期。
综上所述,阳历和农历的转换需要注意年份是否为闰年以及确定正月初一的阳历日期。
转换的方法可以通过查找对应表或使用一些公式进行计算。
如果只是简单的进行阳历和农历的转换,可以参考一些在线的农历转换工具或手机应用。
如果需要深入了解阳历和农历的转换原理以及计算方法,可以查阅相关书籍或网站。
希望以上内容能够对您有所帮助。
Excel公历转农历阳历转阴历
参看一:可以这样试一下:EXCEL2007中可以直接做到,例如TEXT(日期,"[$-130000]e-m-d"),可返回日期的阿拉伯数字的农历年月日,中文农历转换公式如下:B2单元格=MID("庚辛壬癸甲乙丙丁戊己",MOD(TEXT(A2,"[$-130000]e"),10)+1,1)&MID("申酉戌亥子丑寅卯辰巳午未",MOD(TEXT(A2,"[$-130000]e"),12)+1,1)&TEXT(A2,"[dbnum1][$-130000]年M月"&IF(-TEXT(A2,"[$-130000]d")<-10,,"初")&"D日")此公式仅EXCEL2007以使用,EXCEL2003及以下不能正常使用上面那个公式好像有问题,可以试一下这个:参看二:日期在A2,这个公式在B2=CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,10)+1,"庚","辛","壬","癸","甲","乙","丙","丁","戊","己")&CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A2,"[dbnum1][$-130000]年m月"&IF(--TEXT(A2,"[$-130000]d")<11,"初","")&TEXT(A2,"[dbnum1][$-130000]d日"))=CHOOSE(MOD(YEAR(LEFT(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,10)+1,"庚","辛","壬","癸","甲","乙","丙","丁","戊","己")&CHOOSE(MOD(YEAR(LEFT(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),4)&"-"&MID(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A11,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","")&"dd"),2))-1900,12)+1,"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A11,"[dbnum1][$-130000]年m月"&IF(--TEXT(A11,"[$-130000]d")<11,"初","")&TEXT(A11,"[dbnum1][$-130000]d"))Excel公历转农历(阳历转阴历)用的是excel中的自定义函数,代码如下:Public Function NongLi(Optional XX_DATE As Date)Dim MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXiang(11), DayName(30), MonName(12)Dim curTime, curYear, curMonth, curDayDim GongliStr, NongliStr, NongliDayStrDim i, m, n, k, isEnd, bit, TheDate'获取当前系统时间curTime = XX_DATE'天干名称TianGan(0) = "甲"TianGan(1) = "乙"TianGan(2) = "丙"TianGan(3) = "丁"TianGan(4) = "戊"TianGan(5) = "己"TianGan(6) = "庚"TianGan(7) = "辛"TianGan(8) = "壬"TianGan(9) = "癸"'地支名称DiZhi(0) = "子"DiZhi(1) = "丑"DiZhi(2) = "寅"DiZhi(3) = "卯"DiZhi(4) = "辰"DiZhi(5) = "巳"DiZhi(6) = "午"DiZhi(7) = "未"DiZhi(8) = "申"DiZhi(9) = "酉"DiZhi(10) = "戌"DiZhi(11) = "亥"'属相名称ShuXiang(0) = "鼠"ShuXiang(1) = "牛"ShuXiang(2) = "虎"ShuXiang(3) = "兔" ShuXiang(4) = "龙" ShuXiang(5) = "蛇" ShuXiang(6) = "马" ShuXiang(7) = "羊" ShuXiang(8) = "猴" ShuXiang(9) = "鸡" ShuXiang(10) = "狗" ShuXiang(11) = "猪" '农历日期名DayName(0) = "*" DayName(1) = "初一" DayName(2) = "初二" DayName(3) = "初三" DayName(4) = "初四" DayName(5) = "初五" DayName(6) = "初六" DayName(7) = "初七" DayName(8) = "初八" DayName(9) = "初九" DayName(10) = "初十" DayName(11) = "十一" DayName(12) = "十二" DayName(13) = "十三" DayName(14) = "十四" DayName(15) = "十五" DayName(16) = "十六" DayName(17) = "十七" DayName(18) = "十八" DayName(19) = "十九" DayName(20) = "二十" DayName(21) = "廿一" DayName(22) = "廿二" DayName(23) = "廿三" DayName(24) = "廿四" DayName(25) = "廿五" DayName(26) = "廿六" DayName(27) = "廿七" DayName(28) = "廿八" DayName(29) = "廿九" DayName(30) = "三十" '农历月份名MonName(0) = "*" MonName(1) = "正"MonName(2) = "二" MonName(3) = "三" MonName(4) = "四" MonName(5) = "五" MonName(6) = "六" MonName(7) = "七" MonName(8) = "八" MonName(9) = "九" MonName(10) = "十" MonName(11) = "十一" MonName(12) = "腊"'公历每月前面的天数MonthAdd(0) = 0 MonthAdd(1) = 31 MonthAdd(2) = 59 MonthAdd(3) = 90 MonthAdd(4) = 120 MonthAdd(5) = 151 MonthAdd(6) = 181 MonthAdd(7) = 212 MonthAdd(8) = 243 MonthAdd(9) = 273 MonthAdd(10) = 304 MonthAdd(11) = 334'农历数据NongliData(0) = 2635 NongliData(1) = 333387 NongliData(2) = 1701 NongliData(3) = 1748 NongliData(4) = 267701 NongliData(5) = 694 NongliData(6) = 2391 NongliData(7) = 133423 NongliData(8) = 1175 NongliData(9) = 396438 NongliData(10) = 3402 NongliData(11) = 3749 NongliData(12) = 331177 NongliData(13) = 1453 NongliData(14) = 694 NongliData(15) = 201326 NongliData(16) = 2350 NongliData(17) = 465197 NongliData(18) = 3221NongliData(23) = 267611 NongliData(24) = 605 NongliData(25) = 2349 NongliData(26) = 137515 NongliData(27) = 2709 NongliData(28) = 464533 NongliData(29) = 1738 NongliData(30) = 2901 NongliData(31) = 330421 NongliData(32) = 1242 NongliData(33) = 2651 NongliData(34) = 199255 NongliData(35) = 1323 NongliData(36) = 529706 NongliData(37) = 3733 NongliData(38) = 1706 NongliData(39) = 398762 NongliData(40) = 2741 NongliData(41) = 1206 NongliData(42) = 267438 NongliData(43) = 2647 NongliData(44) = 1318 NongliData(45) = 204070 NongliData(46) = 3477 NongliData(47) = 461653 NongliData(48) = 1386 NongliData(49) = 2413 NongliData(50) = 330077 NongliData(51) = 1197 NongliData(52) = 2637 NongliData(53) = 268877 NongliData(54) = 3365 NongliData(55) = 531109 NongliData(56) = 2900 NongliData(57) = 2922 NongliData(58) = 398042 NongliData(59) = 2395 NongliData(60) = 1179 NongliData(61) = 267415 NongliData(62) = 2635NongliData(67) = 2742NongliData(68) = 2391NongliData(69) = 330031NongliData(70) = 1175NongliData(71) = 1611NongliData(72) = 200010NongliData(73) = 3749NongliData(74) = 527717NongliData(75) = 1452NongliData(76) = 2742NongliData(77) = 332397NongliData(78) = 2350NongliData(79) = 3222NongliData(80) = 268949NongliData(81) = 3402NongliData(82) = 3493NongliData(83) = 133973NongliData(84) = 1386NongliData(85) = 464219NongliData(86) = 605NongliData(87) = 2349NongliData(88) = 334123NongliData(89) = 2709NongliData(90) = 2890NongliData(91) = 267946NongliData(92) = 2773NongliData(93) = 592565NongliData(94) = 1210NongliData(95) = 2651NongliData(96) = 395863NongliData(97) = 1323NongliData(98) = 2707NongliData(99) = 265877'生成当前公历年、月、日 ==> GongliStrcurYear = Year(curTime)curMonth = Month(curTime)curDay = Day(curTime)GongliStr = curYear & "年"If (curMonth < 10) ThenGongliStr = GongliStr & "0" & curMonth & "月"ElseGongliStr = GongliStr & curMonth & "月"End IfIf (curDay < 10) ThenGongliStr = GongliStr & "0" & curDay & "日"ElseGongliStr = GongliStr & curDay & "日"End If'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(cur Month - 1) - 38If ((curYear Mod 4) = 0 And curMonth > 2) ThenTheDate = TheDate + 1End If'计算农历天干、地支、月、日isEnd = 0m = 0DoIf (NongliData(m) < 4095) Thenk = 11Elsek = 12End Ifn = kDoIf (n < 0) ThenExit DoEnd If'获取NongliData(m)的第n个二进制位的值bit = NongliData(m)For i = 1 To n Step 1bit = Int(bit / 2)Nextbit = bit Mod 2If (TheDate <= 29 + bit) ThenisEnd = 1Exit DoEnd IfTheDate = TheDate - 29 - bitn = n - 1LoopIf (isEnd = 1) ThenExit DoEnd Ifm = m + 1LoopcurYear = 1921 + mcurMonth = k - n + 1curDay = TheDateIf (k = 12) ThenIf (curMonth = (Int(NongliData(m) / 65536) + 1)) ThencurMonth = 1 - curMonthElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)) ThencurMonth = curMonth - 1End IfEnd If'生成农历天干、地支、属相 ==> NongliStrNongliStr = "农历" & TianGan(((curYear - 4) Mod 60) Mod 10) & DiZhi(((curYear - 4) M od 60) Mod 12) & "年"NongliStr = NongliStr & "(" & ShuXiang(((curYear - 4) Mod 60) Mod 12) & ")"'生成农历月、日 ==> NongliDayStrIf (curMonth < 1) ThenNongliDayStr = "闰" & MonName(-1 * curMonth)ElseNongliDayStr = MonName(curMonth)End IfNongliDayStr = NongliDayStr & "月"NongliDayStr = NongliDayStr & DayName(curDay)NongLi = NongliStr & NongliDayStrEnd Function其中还有个2007版的公式也可以,不过有时候会出错,公式如下:=TEXT(A1,"[$-130000]yyyy年m月"&IF(LEN(--TEXT(A1,"[$-130000]dd"))=1,"初","")&"d")添加评论(0)。
Excel实现公历农历转换的三种方法
Excel实现公历农历转换的三种⽅法【导读】:有时候我们在输⼊⽇期数据的时候,往往需要输⼊农历的⽇期,但已经输⼊的⽇期是公历的⽇期,那么该怎么转换呢?接下来我们将为⼤家如何利⽤excel函数进⾏将公历⽇期转化为农历⽇期!⼀、简单版下表中B2单元格就是第⼀种情况,“2016-9-17”表⽰农历是九⽉⼗七⽇。
该公式是:=TEXT(A2,"[$-130000]YYYY-M-D")。
TEXT()⽤来转化⽂本格式,这个公式的关键是:[$-130000],它是Excel中阳历转化农历的参数,不过它存在⼀个问题就是没法计算闰⽉,估计⽼外⽆法理解中国⼈闰⽉的概念,凡是闰年,它直接表⽰⼀年13个⽉,道理是⼀样的。
⼆、进阶版(中⽂呈现)上表C2单元格,相⽐较B2单元格呈现就有了进阶,以中⽂呈现,并且以天⼲地⽀表现年份。
公式相对之前肯定复杂:=MID(" 甲⼄丙丁戊⼰庚⾟壬癸",MOD(TEXT(A2,"[$-130000]e")-4,10)+1,1)&MID("⼦丑寅卯⾠巳午未申⾣戌亥",MOD(TEXT(A2,"[$-130000]e")-4,12)+1,1)&"年"&TEXT(A2," [$-130000] [DBNum1]m⽉d⽇")我们可以分解为两⼤部分:1)计算年份:MID(" 甲⼄丙丁戊⼰庚⾟壬癸",MOD(TEXT(A2,"[$-130000]e")-4,10)+1,1)&MID("⼦丑寅卯⾠巳午未申⾣戌亥",MOD(TEXT(A2,"[$-130000]e")-4,12)+1,1)&"年",这⾥加了MID()⽂本提取函数来获取天⼲地⽀。
公历转农历方法
初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查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周年国庆)是星期五。
中国日历(公历+农历)算法
中国公历算法中国公历算法不是太难,关键是星期值的确定。
这里给出了简单算法:public static int dayOfWeek(int y, int m, int d) {int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次int ly = (y-1)/4; // 闰年次数ly = ly - (y-1)/100;ly = ly + (y-1)/400;int ry = y - 1 - ly; // 常年次数w = w + ry; // 常年星期值增一w = w + 2*ly; // 闰年星期值增二w = w + dayOfYear(y,m,d);w = (w-1)%7 + 1;return w;}中国农历算法根公历相比,中国农历的算法相当复杂。
我在网上找的算法之中, 的算法是最好的一个。
这个算法使用了大量的数据来确定农历月份和节气的分部,它仅实用于公历 1901 年到 2100 年之间的 200 年。
中国农历计算程式跟据 提供的算法,我写了下面这个程式:[HTML]/*** ChineseCalendarGB.java* Copyright (c) 1997-2002 by Dr. Herong Yang./* 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年*/import java.text.*;import java.util.*;class ChineseCalendarGB {private int gregorianYear;private int gregorianMonth;private int gregorianDate;private boolean isGregorianLeap;private int dayOfYear;private int dayOfWeek; // 周日一星期的第一天private int chineseYear;private int chineseMonth; // 负数表示闰月private int chineseDate;private int sectionalTerm;private int principleTerm;private static char[] daysInGregorianMonth ={31,28,31,30,31,30,31,31,30,31,30,31};private static String[] stemNames ={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};private static String[] branchNames ={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};private static String[] animalNames ={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};public static void main(String[] arg) {ChineseCalendarGB c = new ChineseCalendarGB();String cmd = "day";int y = 1901;int m = 1;int d = 1;if (arg.length>0) cmd = arg[0];if (arg.length>1) y = Integer.parseInt(arg[1]);if (arg.length>2) m = Integer.parseInt(arg);if (arg.length>3) d = Integer.parseInt(arg);c.setGregorian(y,m,d);puteChineseFields();puteSolarTerms();if (cmd.equalsIgnoreCase("year")) {String[] t = c.getYearTable();for (int i=0; i< FONT>} else if (cmd.equalsIgnoreCase("month")) {String[] t = c.getMonthTable();for (int i=0; i< FONT>} else {System.out.println(c.toString());}}public ChineseCalendarGB() {setGregorian(1901,1,1);}public void setGregorian(int y, int m, int d) {gregorianYear = y;gregorianMonth = m;gregorianDate = d;isGregorianLeap = isGregorianLeapYear(y);dayOfYear = dayOfYear(y,m,d);dayOfWeek = dayOfWeek(y,m,d);chineseYear = 0;chineseMonth = 0;chineseDate = 0;sectionalTerm = 0;principleTerm = 0;}public static boolean isGregorianLeapYear(int year) { boolean isLeap = false;if (year%4==0) isLeap = true;if (year%100==0) isLeap = false;if (year%400==0) isLeap = true;return isLeap;}public static int daysInGregorianMonth(int y, int m) {int d = daysInGregorianMonth[m-1];if (m==2 && isGregorianLeapYear(y)) d++; // 公历闰年二月多一天return d;}public static int dayOfYear(int y, int m, int d) {int c = 0;for (int i=1; i<>c = c + daysInGregorianMonth(y,i);}c = c + d;return c;}public static int dayOfWeek(int y, int m, int d) {int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次int ly = (y-1)/4; // 闰年次数ly = ly - (y-1)/100;ly = ly + (y-1)/400;int ry = y - 1 - ly; // 常年次数w = w + ry; // 常年星期值增一w = w + 2*ly; // 闰年星期值增二w = w + dayOfYear(y,m,d);w = (w-1)%7 + 1;return w;}private static char[] chineseMonths = {// 农历月份大小压缩表,两个字节表示一年。
农历计算
农历的计算方法阳历日期推算阴历日期的方法:阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查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即是阴历二十七日。
一、推算年干支口诀掌上推算年干支,支子花甲起根源。
阳支都是旬开始,天干为甲尾四年。
隔位逆推十年正,顺推年尾五零三。
逐支加减六十数,掌上推算千万年。
推算方法:“掌上推算年干支,支子花甲起根源。
”此法是将地支排列在掌中,手掌上推算年干支的方法。
首先,在掌上将地支定位(图一),然后以地支子位为花甲子的开始,可定为1864,1924,也可定为1984年???,其年都是甲子年。
“阳支都是旬开始,天干为甲尾四年。
”地支中的子,寅,辰,午,申,戌都是阳支,而且也是每旬的开始,天干都为甲,即甲子,甲戌,甲申,甲午,甲辰,甲寅,这些年的公历尾数均为四。
“隔位逆推十年正,顺推年尾五零三。
”天干十数,地支十二数,天干与地支组合天干每循环一次,地支总与下二支(旬空)。
其中余下的第一支便是下旬的开始。
我们从地支子位开始,隔一位逆推,即从子位逆推隔亥到戌,恰是甲戌旬的开始,再逆推隔一位酉至申为甲申旬开始,------年尾数都为四,年间隔都是十年。
农历转阳历怎么转.
农历转阳历怎么转?农历转阳历怎么转?农历一直是老百姓较为熟悉的历法或者也叫阴历,而阳历是现代通用的历法,那么这二者之间有什么关系呢,农历转阳历有如何转换呢?这里小编就为大家介绍下究竟农历如何转阳历!要了解农历转阳历怎么转,首先我们要先弄清楚2个问题,那就是什么是农历;什么是阳历,他们是以什么为计算依据的!农历是我国采用的一种传统历法,又名夏历、中历、旧历,民间也有称阴历的。
它用严格的朔望周期来定月,又用设置闰月的办法使年的平均长度与回归年相近,兼有阴历月和阳历年的性质,因此在实质上是一种阴阳合历。
农历依据是月亮的运动规律:月球运行的轨道,名曰白道,白道与黄道同为天体上之两大圆,以五度九分而斜交,月球绕地球一周,出没于黄道者两次,历二十七日七小时四十三分十一秒半,为月球公转一周所需的时间,谓之“恒星月”。
唯当月球绕地球之时,地球因公转而位置亦有变动,计前进二十七度余,而月球每日行十三度十五分,故月球自合朔,全绕地球一周,复至合朔,实需二十九日十二时四十四分二秒八,谓之“朔望月”,习俗所谓一个月,即指朔望月而言。
阳历也就是公历,它是国际通用的。
阳历以地球绕太阳转一圈的时间定做一年,共365天5小时48分46秒。
平年只计365天这个整数,不计尾数;一年分做12个月,大月31天,小月30天,二月只有28天。
四年的尾数积累起来共1天光景,加在第四年的二月里,这一年叫做闰年。
所以闰年的二月有29天。
那么农历转阳历怎么转呢?一般而言农历转阳历都有工具的,不用人工计算!电脑转换工具方法1:农历转阳历工具人工公历转农历方法2:阳历日期推算阴历日期的方法:前已述及阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。
Excel公历转农历阳历转阴历精品文档15
参看一:可以这样试一下:EXCEL200冲可以直接做到,例如TEXT(日期,"[$-130000]e-m-d"),可返回日期的阿拉伯数字的农历年月日,中文农历转换公式如下:B2单元格=MID(" 庚辛壬癸甲乙丙丁戊己",MOD(TEXT(A2,"[$-130000]e"),10)+1,1)&MID(" 申酉戌亥子丑寅卯辰巳午未",M0D(TEXT(A2,"[$-130000]e"),12)+1,1)&TEXT(A2,"[dbnum1][$-130000] 年M月"&IF(-TEXT(A2,"[$-130000]d")v-10,," 初")&"D 日")此公式仅EXCEL2007以使用,EXCEL2003及以下不能正常使用上面那个公式好像有问题,可以试一下这个:参看二:日期在A2,这个公式在B2=CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy 年mmM"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初","")&"dd"),6,2)&"-"&RIGHT(TEXT(A2,"[$-130000]yyyy 年mmM"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初","")&"dd"),2))-1900,10)+1," 庚","辛壬"," 癸"," 甲"," 乙"," 丙"," 丁"," 戊","II II")&CHOOSE(MOD(YEAR(LEFT(TEXT(A2,"[$-130000]yyyy年mm月"&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初年mm 月II II 寅"," 卯"," 辰", 巳"," 午"," 未","申"," 酉"," 戌"," 亥 ","")&"dd"),4)&"-"&MID(TEXT(A2,"[$-130000]yyyy "&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初&"dd"),6,2)&叮&RIGHT(TEXT(A2,"[$-130000]yyyy年 mmM "&IF(LEN(--TEXT(A2,"[$-130000]dd"))=1," 初","")&"dd"),2))-1900,12)+1," 子丑")&TEXT(A2,"[dbnum1][$-130000]年 m 月"&IF(--TEXT(A2,H [$-130000]d H )<11,"初 ","")&TEXT(A2,"[dbnum1][$-130000]d 日")) 二CHOOSE(MOD(YEAR(LEFT(TEXT(A1[$-130000]yyyy 年 mm 月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),4)&"-"&MID(TEXT(A11,"[$-130000]yyyy年 mm 月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),6,2)&"-"&RIGHT(TEXT(A11,"[$-130000]yyyy年 mm 月" &IF(LEN(--TEXT(A11,"[$-130000]dd"))=1," 初","")&"dd"),2))-1900,10)+1," 庚"," 辛"," 壬"," 癸"," 甲"," 乙"," 丙"," 丁"," 戊"," 己")&CHOOSE(MOD(YEAR(LEFT(TEXT(A11,"[$-130000]yyy 年 mm 月 "&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1,"初","") &"dd"),4)&"-"&MID(TEXT(A11,"[$-130000]yyyy 年 mm 月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1," 初","")&RIGHT(TEXT(A11,"[$-130000]yyyy 年mn月"&IF(LEN(--TEXT(A11,"[$-130000]dd"))=1," 初","")&"dd"),2))-1900,12)+1," 子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")&TEXT(A11,"[dbnum1][$-130000] 年m月"& IF(--TEXT(A11,"[$-130000]d")<11," 初","")& TEXT(A11,"[db num1][$-130000]d"))Excel公历转农历(阳历转阴历)用的是excel中的自定义函数,代码如下:Public Fun ction No ngLi(Optio nal XX_DATIAs Date)Dim MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXiang(11), DayNam e(30), Mon Name(12)Dim curTime, curYear, curM on th, curDayDim Go ngliStr, Non gliStr, Non gliDayStrDim i, m, n, k, isE nd, bit, TheDate'获取当前系统时间curTime = XX_DATETianGan(0)=" 甲TianGan⑴=" 乙TianGan(2)=" 丙TianGan(3)=" 丁Tia nGa n(4)= "戊" Tia nGa n(5)= "己" Tia nGa n(6)= "庚" Tia nGa n⑺= " 辛" Tia nGa n(8)= "壬" Tia nGa n(9)= " 癸"'地支名称DiZhi(O)=" 子" DiZhi(1)=" 丑" DiZhi(2)=" 寅" DiZhi(3)=" 卯" DiZhi(4)=" 辰" DiZhi(5)=" 巳" DiZhi(6)=" 午" DiZhi(7)=" 未" DiZhi(8)=" 申" DiZhi(9)=" 酉" DiZhi(1O)=" 戌" DiZhi(11)=" 亥" '属相名称ShuXia ng(O) ="鼠" ShuXia ng(1) =" 牛" ShuXia ng(2) =" 虎"ShuXian g(3)= " 兔" ShuXian g(4)= "龙" ShuXian g(5)= "蛇" ShuXian g(6)= "马" ShuXian g(7)= " 羊" ShuXian g(8)= "猴" ShuXian g(9)= " 鸡" ShuXian g(10) =" 狗" ShuXian g(11) ="猪" '农历日期名DayName(O)= "*" DayName(1)= "初一" DayName(2)= "初二" DayName(3)= "初三" DayName(4)= "初四" DayName(5)= "初五" DayName(6)= "初六" DayName(7)= "初七" DayName(8)= "初八" DayName(9)= "初九" DayName(IO) ="初十DayName(11) -"十DayName(12) ="十二DayName(13): ="十三" DayName(14): ="十四" DayName(15): ="十五" DayName(16): ="十六" DayName(17): ="十七" DayName(18): ="十八" DayName(19): ="十九" DayName(20): ="二十" DayName(21): ="廿一" DayName(22): ="廿二" DayName(23): ="廿三" DayName(24): ="廿四" DayName(25): ="廿五" DayName(26): ="廿六" DayName(27): ="廿七" DayName(28): ="廿八" DayName(29): ="廿九" DayName(30): ="三十" '农历月份名MonN ame(O)= "*" MonN ame(1)= "正" MonN ame(2)= 1! ------- 1! MonN ame(3)= " - "MonN ame(4)= "四" MonN ame(5)= "五" MonN ame(6)= "六" MonN ame(7)= "七" MonN ame(8)= "八" MonN ame(9)= "九" MonN ame(10) ="十" MonN ame(11) -"十- MonN ame(12) ="腊" '公历每月前面的天数Mon thAdd(O)= 0 Mon thAdd(1)= 31 Mon thAdd(2)= 59 Mon thAdd(3)= 90 Mon thAdd(4)= 120 Mon thAdd(5)= 151 Mon thAdd(6)= 181 Mon thAdd(7)= 212 Mon thAdd(8)= 243 Mon thAdd(9)= 273 Mon thAdd(1O) =304 Mon thAdd(11) =334 '农历数据Non gliData(O) = 2635 Non gliData⑴=333387 No ngliData(2) = 1701 No ngliData(3) = 1748 No ngliData(4) = 267701 No ngliData(5) = 694No ngliData(6) = 2391 Non gliData(7) = 133423 No ngliData(8) = 1175 Non gliData(9) = 396438 No ngliData(10) = 3402 No ngliData(11) = 3749 No ngliData(12) = 331177 No ngliData(13) = 1453 Non gliData(14) = 694 No ngliData(15) = 201326 Non gliData(16) = 2350 No ngliData(17) = 465197 No ngliData(18) = 3221No ngliData(22) = 1386No ngliData(20) = 400202 No ngliData(21) = 2901No ngliData(45)No ngliData(24) No ngliData(25) No ngliData(26) No ngliData(27) No ngliData(28) No ngliData(29) No ngliData(30) No ngliData(31) No ngliData(32) No ngliData(33) No ngliData(34) No ngliData(35) No ngliData(36) No ngliData(37) No ngliData(38) No ngliData(39) No ngliData(40) No ngliData(41)No ngliData(45)No ngliData(45)605 2349 137515 2709 464533 1738 2901 330421 1242 2651 199255 1323 529706 3733 1706 398762 2741 1206 267438 2647 1318 204070No ngliData(42)No ngliData(43)No ngliData(44)No ngliData(46) = 3477 No ngliData(47)No ngliData(48)No ngliData(49)No ngliData(50)No ngliData(51)No ngliData(52)No ngliData(53)No ngliData(54)No ngliData(55)No ngliData(56)No ngliData(57)No ngliData(58)No ngliData(59)No ngliData(60)No ngliData(61)No ngliData(62)No ngliData(63)No ngliData(64)No ngliData(68) 2391No ngliData(68)2391 461653 1386 2413 330077 1197 2637 268877 3365 531109 2900 2922 398042 2395 1179 267415 2635 661067 1701 1748 No ngliData(65)No ngliData(66)No ngliData(67)Non gliData(69) = 3300311175 No ngliData(70)1611 No ngliData(71)200010 No ngliData(72)3749 No ngliData(73)527717 No ngliData(74)1452 No ngliData(75)2742 No ngliData(76)332397 No ngliData(77)2350 No ngliData(78)3222 No ngliData(79)268949 No ngliData(80)3402 No ngliData(81)3493 No ngliData(82)133973 No ngliData(83)1386 No ngliData(84)464219 No ngliData(85)605 No ngliData(86)2349 No ngliData(87)334123 No ngliData(91) 267946No ngliData(88)No ngliData(89)No ngliData(90)No ngliData(91) 267946No ngliData(92) = 2773Non gliData(93) = 592565No ngliData(94) = 1210No ngliData(95) = 2651Non gliData(96) = 395863No ngliData(97) = 1323No ngliData(98) = 2707Non gliData(99) = 265877'生成当前公历年、月、日==> GongliStrcurYear = Y ear(curTime)curM onth = Mon th(curTime)curDay = Day(curTime)Gon gliStr = cur Year & ”年”If (curMo nth < 10) The nGongliStr = GongliStr & "0" & curMonth & " 月" ElseGo ngliStr = Gon gliStr & curMo nth & " 月"End IfIf (curDay < 10) The nGo ngliStr = Go ngliStr & "0" & curDay & " 日"ElseGo ngliStr = Go ngliStr & curDay & " 日"End If'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)TheDate = (curYear - 1921) * 365 + In t((curYear -1921)/4) + curDay + Month Add(curMo nth - 1) - 38If ((curYear Mod 4) = 0 And curMonth > 2) ThenTheDate = TheDate + 1End If'计算农历天干、地支、月、日isE nd = 0m = 0DoIf (No ngliData(m) < 4095) Thenk = 11Elsek = 12End Ifn 二kDoIf (n < 0) The nExit DoEnd If'获取NongliData(m)的第n个二进制位的值bit = No ngliData(m)For i = 1 To n Step 1bit = In t(bit / 2)Nextbit = bit Mod 2If (TheDate <= 29 + bit) The nisE nd = 1Exit DoEnd IfTheDate = TheDate - 29 - bitn 二n - 1LoopIf (isE nd = 1) ThenExit DoEnd Ifm = m + 1LoopcurYear = 1921 + mcurMo nth = k - n + 1curDay = TheDateIf (k = 12) The nIf (curM on th = (In t(No ngliData(m) / 65536) + 1)) The n curMo nth = 1 - curMo nthElseIf (curM on th > (In t(No ngliData(m) / 65536) + 1)) Then curMo nth = curMo nth - 1 End IfEnd If'生成农历天干、地支、属相==> NongliStrNo ngliStr =" 农历"& Tia nGan (((curYear - 4) Mod 60) Mod 10) & DiZhi(((curYear-4) Mod 60) Mod 12) & " 年"NongliStr = NongliStr & "(" & ShuXiang(((curYear - 4) Mod 60) Mod 12) & ")"'生成农历月、日==> NongliDayStrIf (curM on th < 1) The nNon gliDayStr =" 闰” & Mo nN ame(-1 * curMo nth)ElseNo ngliDayStr = MonN ame(curMo nth)End IfNongliDayStr = NongliDayStr & ” 月”No ngliDayStr = No ngliDayStr & DayName(curDay)Non gLi = Non gliStr & No ngliDayStrEnd Fun cti on其中还有个2007版的公式也可以,不过有时候会出错,公式如下:二TEXT(A1,"[$-130000]yyyy 年m月"&IF(LEN(--TEXT(A1,"[$-130000]dd"))=1," 初","")& "d")添加评论(0)希望以上资料对你有所帮助,附励志名言3条:1、生命对某些人来说是美丽的,这些人的一生都为某个目标而奋斗2、推销产品要针对顾客的心,不要针对顾客的头。
