公历转农历

公历转农历为方便叙述,首先介绍两个函数高斯函数: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.公历转农历生肖干支纪年节气算法研究和C程序实现农历的那些事儿(一) 香港天文台农历数据(txt版) 香港天文台农历数据(pdf版) 二、关于农历 查阅了大量关于公历转农历的博文之后,明确了:所谓的公历转农历算法即系基于查表法推算。因为农历无明显规律,数据需要天文台观测得到,因此无法用公式将公历转成农历。 https://blog.csdn.net/Stack_/article/details/119980697
2.国历和农历怎么转换6、国历与农历的换算公式 求教高人!!! 你指的是公历与农历的换算公式吧?这个算法复杂,我可以提供C或C++的API函数给你,不知道你是用什么语言来编的? 7、转换农历国历 网友分享:你好,国历1997.13,转换为农历是1997年1月7日,星星期四;国历1997.1,转换为农历是1996年12月24日,星期六。 https://www.105188.com/sh/618011.html
3.一种公历到农历日期转换算法的实现本文主要从单片机软件实现角度介绍一种公历到农历转换的算法思想, 算法采用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
4.公历和农历转换算法详解20220701131755.pdf内容提供方:zxj41232 大小:368.33 KB 字数:约2.91万字 发布时间:2022-07-03发布于天津 浏览人气:12 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)公历和农历转换算法详解.pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 公历和农历转换算法详解 /https://max.book118.com/html/2022/0701/8127004061004114.shtm
5.公历农历转换计算公式理想股票技术论坛在我们的股票论坛上,您可以找到关于公历农历转换的计算公式、方法和工具。了解如何将公历日期转换为农历日期,并从我们的算法中获得准确的结果。无论您是在研究历史数据还是计划未来的投资,这些公历农历转换工具都可以帮助您更好地理解和分析股市走势。与其他股民和专业人https://www.55188.com/tag-thread-7054278-1.html
6.公历与农历转换组件其它相关资料下载公历与农历转换组件,公历与农历转换组件https://download.eeworld.com.cn/detail/nonogugu66/434873
7.python阳历推算阴历python公历转农历python阳历推算阴历 python公历转农历 去年我家李大锤出生,办出生证明前根据老家族谱、八字、五行起名字,我起了十几个,然后再请村里大叔公算了一下。 于是心血来潮,决定研究一下阳历转换农历的算法,但网上几乎都是几种文章(或其演绎版本),笔者看了看,好像能得到正常结果,但没深入理解算法。为了练手Python,决定https://blog.51cto.com/u_16213659/8840906
8.Python实现公历(阳历)转农历(阴历)的方法示例python这篇文章主要介绍了Python实现公历(阳历)转农历(阴历)的方法,涉及农历算法原理及Python日期运算相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下: 两个要点: 1、公历转农历用了查表法(第126行) https://www.jb51.net/article/121808.htm
9.免费阴历阳历转换在线工具网(zxgj.cn)阴历阳历转换免费 已经有11.2w+人使用8人评论 HR 在线人才测评系统心理疾病精神疾病筛查人格障碍测试PDQ量表测试你的智商高低 公历转农历,阳历转阴历 请输入公历(阳历)日期 19401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198https://www.zxgj.cn/g/yinyangli
10.python实现的阳历转阴历(农历)算法Flex公历转农历算法 Flex公历转换成农历的类(参考C++版本)。 使用方式: new ChineseDate(new Date()).date 输出公历日期对应的农历格式。 上传者:liu_you时间:2009-12-25 Python实现公历(阳历)转农历(阴历)的方法示例 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下: 两https://www.iteye.com/resource/weixin_38721119-13777616
11.公农历转换原理及万年历写法万年历查询黄道吉日首先要保存公历农历之间的转换信息:以任意一年作为起点,把从这一年起若干年(若干是多少?就看你的需要了)的农历信息保存起来。至于这些数据的格式,那就看你的能力了,当然是越精简越精确的越好,具体算法后面详述。 例如我的代码中,就是先保存“1921年2月8日 正月初一 星期二:”作为一个基本观测点,然后据此再保存http://wannianli.1518.com/view-518