公历和农历的转换算法

类库 2005-01-27 04:39:00
目前我只知道以下
相关知识:

1.农历是一种阴阳历,一个农历月约等于一个朔望月(月亮的一个圆缺
周期),而一年为12个月,每月为29或30天,比一个回归年(与现行
公历的年差不多)的天数,采用了插入闰月的方式来使农历一年不要
与回归年差别太大。
2.农历采用了19年7闰的方式插入闰月,闰月的确定采用了以下法则:不
包含中气的月份作为前一个月的闰月。中气是二十四节气中的概念,
其实就是出现在公历下半月的十二个节气。
3.农历和公历有周期为十九年的粗略对应规律,也就是某一个公历日期
的对应农历日期与19年前的同一公历日期对应的农历日期相同或相近。
闰月的规律也是如此。

但是,我目前尚未找到确定农历大小月的办法,而且也没有计算每年二
十四节气所在时刻的算法(与太阳在黄道上的位置相关,应该是黄经每15度
一个节气,但太阳在黄道上各点移动速度我不清楚)。若各位有相关知识或现
成算法,请不吝赐教。
...全文
2983 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
JK_10000 2005-01-31
  • 打赏
  • 举报
回复
回复人: seaquester() ( ) 信誉:100 2005-1-29 8:32:18 得分: 0

------
这一贴回得很好
尤其是关于农历闰月的算法(虽说没看懂中气是什么意思)。
fairyboy 2005-01-29
  • 打赏
  • 举报
回复
这东西精确计算需要的数据太多,很多基本不可能得到,时间长了误差也难以容忍。一般需要每年的实际测量,然后推算后面若干年,找一些资料,把算好的建表查询就行了。
seaquester 2005-01-29
  • 打赏
  • 举报
回复
阴历规则

孟卓(zhuo@thunder.cwru.edu)


中国的阴历,又称农历,大家应该都很熟悉。很多的传统节日,像春节,中秋都是阴历的节日。不过,若是问起阴历的规则,怕是知道的人就不多了。多数人知道初一是新月出现的那一天,月圆的那一天则在十五左右。不少人也知道二十四节气在阳历的每月中大概的日期。再细节的概念如闰月对大多数人则不甚了解了。本人经过一番查找与阅读,终于对阴历的规则有了一定的认识。在此愿与大家分享。

首先阴历以月为基本单位,一个月以新月出现的那一天为始直至下一个新月出现的前一天。由于月亮公转的周期介于29到30天之间,阴历的一个月也就由新月出现时刻的早晚或是29天或是30天。大月为30天,小月为29天。与阳历不同的是,大小月在不同的年中不固定。如春节的前一天常称为大年三十,但有不少年如2000年的阴历十二月只有29天。由于十二个月的时间较阳历年即地球绕太阳公转一周的时间短11天左右,为了使阴历年与阳历年保持相对稳定,每隔两三年就需要加入一个闰月。大约每十九年要加入七个闰月。而二十四节气则是由地球在绕太阳公转的轨道上的位置确定的。以每年的冬至为始,每15度为一个节气。是故二十四节气在阳历的每月中有大概固定的日期。古时以二十四节气指导农耕,这就是阴历又称农历的原因。其中阳历下半月的十二个节气又称为中气。中气出现的时刻和闰月的确定有直接的关系。

中国阴历的计算有下列四条规则:

所有新月和节气出现的时刻的计算以北京时间为准。现北京时间为东经120度即东八区标准时。但计算1929年以前的阴历时应以北京即东经116度25分的当地时为准。此条规则用以区分中国阴历和其他类似阴历如日本阴历。

新月出现的一天为一个月的第一天。如某个节气的出现时刻也在这一天,则不论该节气的出现时刻是否比新月晚,一律算落入新的一个月中。

每年的冬至总是出现在这年的阴历十一月中。

从一年的冬至后一天起到下一年冬至这一天止的这段时间中,下称其间,如有十三个新月出现,则其间要加入一个闰月。需要加入闰月时,其间第一个没有中气的月为闰月。因为其间只有十二个中气,所以其间至少有一个月没有中气,也存在有两个月没有中气的可能性。但这种情况下只有第一个没有中气的月为闰月。闰月的前一个月为几月则该闰月称为闰几月。

以上所列的阴历的计算规则是在清朝顺治年间,即公元1645年,开始采用的。以上规则的一个重要特点就是理论上完全以天文观测为依据,其中没有任何数学关系。这和阳历,即格里历,完全是由数学关系确定的形成了鲜明的对比。当然,具体到未来阴历的计算,仍然需要月亮与地球运动的数学模型,而且精度高的这种数学模型相当复杂,在没有电脑的情况下,一般人根本不可能推算出精确的阴历来。而阳历的数学关系则非常简单,是不是闰年很容易计算。这又形成了另外一种鲜明的对比。

--------------------------------------------------------------------------------
seaquester 2005-01-29
  • 打赏
  • 举报
回复
这个是中文的网站
http://thunder.eeap.cwru.edu/ccal/index.html
seaquester 2005-01-29
  • 打赏
  • 举报
回复
看看这个网站
http://www.math.nus.edu.sg/aslaksen/calendar/chinese.html
NowCan 2005-01-28
  • 打赏
  • 举报
回复
通过计算的万年历也有,但没有算法说明.而且计算量相当大,且也还是有年限限制的,超年限的话误差会增加.
这个东西牵涉到一些天文知识(主要是地球自转,公转周期以及月球的公转周期,日月的方位等)
有个<日梭万年历>可供参考.
liangbch 2005-01-28
  • 打赏
  • 举报
回复
我曾经花费了一段时间,研究了农历 大小月的变化规律,润月的规律(在那年那个月后会增加一个润月),却没有得到满意的结果。只得出如下结论:

1.19年7润没错,书上也是这么讲的,其周期性很强,但近100年来有一次例外。
2.经对比近100年来的所有数据发现,大小月的变化周期为49个月,但每个周期总有几个月和上个周期不同,但没有找出规律。
3.应该在那个月后插入润月没有找到准确的规律。
总之,农历的大小月变化,润月的设置,找不出简单严格的规则。故几乎所有的往年历软件均设用茶表法来实现,楼主如果想做一个类似的软件,可找一本万年历的书或者资料,依此编写一个适合你程序使用的常数数组和程序即可。





类库 2005-01-28
  • 打赏
  • 举报
回复
to ericzhangali(另一个空间):
我在网上能找到的也就那点东西,所以就贴过来问了,嘿嘿,不好意思
loveisbug 2005-01-28
  • 打赏
  • 举报
回复
符点运算
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
跟节气有关的只有这两个数据

-->>

跟节气有关的只有这几个数据
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
跟节气有关的只有这两个数据

节气名称:
var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至")

节气点时间(单位是分钟):

var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758)

某个小寒点 (1900,0,6,2,5)

地球公转周期:31556925974.7
loveisbug 2005-01-28
  • 打赏
  • 举报
回复
呵呵,抬个杠,在你前面提供的链接里提供了代码链接,大致看了看代码,两个数组,大概有0.3k,和节气有关的数组里的数得32位表示,运算也是,在有些16位的嵌入环境里是不能这样算的。
如果是在pc上做,资源比较宽裕,存表的直观也是它的优势。

不过,那段代码确是提供了不错的想法。

还有,黄历的数据量太大,我现在暂时没有很好的处理数据的思路。就是宜什么忌什么的东西。

还有,楼主的发贴内容在网上居然也搜出来了:


发信人: goldeagle()
整理人: cobe(1999-12-03 02:59:24), 站内信件
【 以下文字转载自 CLanguage 讨论区 】
【 原文由 金鹰 所发表 】
我一直以来都希望能找到一个算法来算中国的农历,目前我只知道以下
相关知识:

1.农历是一种阴阳历,一个农历月约等于一个朔望月(月亮的一个圆缺
周期),而一年为12个月,每月为29或30天,比一个回归年(与现行
公历的年差不多)的天数,采用了插入闰月的方式来使农历一年不要
与回归年差别太大。
2.农历采用了19年7闰的方式插入闰月,闰月的确定采用了以下法则:不
包含中气的月份作为前一个月的闰月。中气是二十四节气中的概念,
其实就是出现在公历下半月的十二个节气。
3.农历和公历有周期为十九年的粗略对应规律,也就是某一个公历日期
的对应农历日期与19年前的同一公历日期对应的农历日期相同或相近。
闰月的规律也是如此。

但是,我目前尚未找到确定农历大小月的办法,而且也没有计算每年二
十四节气所在时刻的算法(与太阳在黄道上的位置相关,应该是黄经每15度
一个节气,但太阳在黄道上各点移动速度我不清楚)。若各位有相关知识或现
成算法,请不吝赐教。

--
行侠仗义吾本性,展翅翱翔天地间
请加入我创建的邮件列表“金鹰的程序员天地”:
(发一封空邮件到 sml-geprogram-subscribe@mylist.soim.com,
再回复一封确认信就可以了)

※ 来源:.月光程序代码网 http://www.moon-soft.com.[FROM: 202.103.182.36]
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
“基本没看到不存表可以算出结果的”

节气的算法,是以日为历
是固定的,不需要存表。

不过,对于考古研究的人来说
由于很早以前算节气的算法不是很准,
所以不可以简单用这些算法来将史书上的节日与公历换算

另外,需要提一下的是
虽说古代人并不以为地球是圆的,但是他们对节气的计算却相当准确。
夏至和冬至的测量相对比较简单,他们最容易测得。
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
“400年的整数也是润年”
----

31556925974.7为地球公转周期,是毫秒。(如果换算成天,是265.242199天,所以每四百年就有97个闰年,同样,我们也可以看到,如果这样做的话,一百三十万年后,我们的公历算法将有一天的误差)
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
"60年一轮回"
是指天干地支轮回一次,叫做一甲子,
这与节气没什么关系吧。
gzlcd 2005-01-28
  • 打赏
  • 举报
回复
应该没有纯粹的理论计算公式,虽然说60年一轮回,但根据天文资料还是有调整的。
例如400年的整数也是润年就说明问题所在了。
loveisbug 2005-01-28
  • 打赏
  • 举报
回复
呵呵,基本没看到不存表可以算出结果的。在嵌入环境里,存表的开销很大,只能在存的方法上想办法。
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
找到了,在这一贴里:

http://community.csdn.net/Expert/topic/3239/3239912.xml?temp=7.244289E-03
JK_10000 2005-01-28
  • 打赏
  • 举报
回复
"节气无任何确定规律"
错!
俺上次写过有关节气算法解释的一篇文章,现在忽然找不到。
等俺再找找去
loveisbug 2005-01-28
  • 打赏
  • 举报
回复
公历算农历是有算法的;
节气无任何确定规律,所以只能存表,但节气对应阳历日期基本还是比较固定的平均分布,存表可想办法节省空间;
黄历的数据60年一轮,只能存表,可用一些简单的压缩算法。

我刚做好一套万年历带黄历,但不能给你提供再具体的建议了。
加载更多回复(2)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧