公历转农历

公历转农历为方便叙述,首先介绍两个函数高斯函数: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)来支持了,计算起来更为麻烦,不过用计算机算起来也许很快,只是我不会编程,暂时没法验证。

另外,对于儒略历y年m月d日,有8≤y≤1582且y+m/10≤1583且y+m+d/4≤1593,此时f(m)=30m+[m/2]+[m/9]+ε+([2/m]-[1/m])*(1-[[y/4]-y/4]),(ε为一待定常数项)f(y)=36525a+365b+[b/4],设f(y,m,d)=f(y)+f(m)+d,则f(y,m,d)=36525a+365b+[b/4]+30m+[m/2]+[m/9]+([2/m]-[1/m])*(1-[[y/4]-y/4])+ε+d,则f(y,m,d)就是公元y年m月d日一个相对的序数,应用这个式子可以计算儒略历时的星期和干支等数据,不再赘述。

THE END
1.新闻多一度丨龙年龙月龙日龙时再聚首超高“龙含量”怎么算?辰时关于龙年龙月龙日龙时是怎么回事呢?这其实是中国传统计时法中干支纪法和生肖纪法经过转换之后形成的一种说法,就是指辰年、辰月、辰日、辰时,而辰与十二生肖中的龙相配。所以每逢这个时刻就是所谓的龙年龙月龙日龙时了。 干支纪法与天干地支密切相关,什么是干支纪年?天干地支又是如何搭配的?https://www.163.com/dy/article/J0D8N99H0512D3VJ.html
2.国历和农历怎么转换你指的是公历与农历的换算公式吧?这个算法复杂,我可以提供C或C++的API函数给你,不知道你是用什么语言来编的? 7、转换农历国历 网友分享:你好,国历1997.13,转换为农历是1997年1月7日,星星期四;国历1997.1,转换为农历是1996年12月24日,星期六。 8、谁知道生日国历怎么换算成农历? https://www.105188.com/sh/618011.html
3.农历阳历转换阴历转公历查询阴历阳历换算农历知识问答:公历是农历还是阳历?解答:公历是阳历。农历是阳历还是阴历?解答:农历是阴历。 您也可以在『万年历』中查询。如何在万年历进行阴历查阳历:一般阴历日期大概落后阳历日期一个月,比如要查2010年农历四月二十的阳历,翻动万年历,可能在2010年5月或6月的界面找到。 https://m.buyiju.com/cha/yyl.php
4.oracle日历转化成农历你可以参考现有的开源算法,如《中国农历算法》或者网上公开的农历转换库。 另外,压缩包中的"Oracle中如何将日期转换成农历.orasql"文件可能包含了一个已经实现好的转换过程或函数,你可以导入并使用它。导入方法如下: ```sql @$Oracle中如何将日期转换成农历.orasql ``` 导入后,你就可以调用这个函数来转换日期了https://download.csdn.net/download/sjzzhx123123/3859413
5.阳历转化成农历法.docxC++中怎样将阳历转化成农历已关闭20[标签:C++,阳历,农历]小A角、2011-05-0311:06推荐答案一、原理篇公历转换农历的算法公历(GregorianCalendar)与农历(ChineseLunarCalendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。比较常用并且比较简单的公历转https://m.renrendoc.com/paper/308154963.html
6.python实现的阳历转阴历(农历)算法Flex公历转农历算法 Flex公历转换成农历的类(参考C++版本)。 使用方式: new ChineseDate(new Date()).date 输出公历日期对应的农历格式。 上传者:liu_you时间:2009-12-25 Python实现公历(阳历)转农历(阴历)的方法示例 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下: 两https://www.iteye.com/resource/weixin_38721119-13777616
7.php怎么将农历转换成公历?Worktile社区这段代码实现了将农历日期转换为公历日期的功能。你只需要将需要转换的农历日期的年、月、日作为参数传入函数`lunarToSolar()`,就可以得到对应的公历日期。需要注意的是,这里只示范了部分农历日期的转换规则,你需要根据实际情况进行相应的计算。 下面是将农历转换成公历的步骤和方法: https://worktile.com/kb/ask/180274.html
8.一种公历到农历日期转换算法的实现本文主要从单片机软件实现角度介绍一种公历到农历转换的算法思想, 算法采用MCS-51 指令系统实现。并给出程序流程图,另外对二十四节气和生肖的算法也做详细介绍。关键词:单片机;MCS-51 指令系统Abstract: This paper introduces the realization and algorithm of the transform between Gregorian calendar and lunar https://m.elecfans.com/article/39160.html
9.免费阴历阳历转换在线工具网(zxgj.cn)阴历阳历转换免费 已经有11.2w+人使用8人评论 HR 在线人才测评系统心理疾病精神疾病筛查人格障碍测试PDQ量表测试你的智商高低 公历转农历,阳历转阴历 请输入公历(阳历)日期 19401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198https://www.zxgj.cn/g/yinyangli
10.Python实现公历(阳历)转农历(阴历)的方法示例python这篇文章主要介绍了Python实现公历(阳历)转农历(阴历)的方法,涉及农历算法原理及Python日期运算相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下: 两个要点: 1、公历转农历用了查表法(第126行) https://www.jb51.net/article/121808.htm
11.怎样将公历年号转换成农历年号?怎样将公历年号转换成农历年号? ①将公历年号减去3,除以60。显然,余数是小于60的两位数。 ②余数的个位数1~9对应天干“甲乙丙丁戊己庚辛壬”,0对应“癸”。 ③余数再除以12,得到的余数,对应“地支”的12个字:子丑寅卯辰巳午未申酉戌亥(0对应亥)。 https://www.meipian.cn/4oo74h28
12.农历公历转换阴历转阳历 请输入农历(阴历)日期: 年月日 农历是中国传统历法,现在生活中一般俗称阴历(太阴历-按月亮月相周期变化计算的历法)。阳历为太阳历,以地球公转周期计算的历法,公历就是一种太阳历。公历是现今世界通行的历法,即公历纪元、亦称西历,西元、公元等。https://t.aies.cn/shijian/nongli/
13.WPS表格怎么将公历转化成阴历日Ɯ以上就是将公历日期转换为阴历日期的方法。希望能对您有所帮助! 有用(0) 回复 sharpsword666 在WPS EXCEL中已试过了所有公式,都无法将公历日转化成农历日,到底什么原因呢? 有用(0) 回复 948186579 方法:1、在同一单元格插入多个日期:需要逐个输入2、不同单元格间输入多个日期:输入当天日期:+today(),固定https://wap.zol.com.cn/ask/x_20332058.html