|
1#
发表于 2004-8-26 19:16 |
只看该作者
关于公历年月日与干支的转化问题
本来的题目叫“关于公历年月日、农历月相与干支的转化问题”,但后面一半未写成,公式也未选择好,等不及了先写出简单些的。各位都是高人,举一必能反三。我也是边写边修正,大家多提意见。 一、 前提假设:历史上日子干支是连续的 二、 建立时间坐标: 1、 以公元1年1月0日(即公元前1年12月31日)为原点; 2、 坐标单位是日。 3、 历史日子到原点的距离就是该日子的坐标,称为“公元日序数”,原点前的公元日序数为负,原点后的公元日序数为正。例如公元1年1月1日的公元日序数为1,公元前1年1月1日的公元日序数为-1。每个历史日子只有一个公元日。公元日序数是连续的。 说明:建立时间坐标系统,是编制历法、表格的一般性方法。选取公元历作为时间参照系主要是按因应一般使用习惯,它本身只是一种简单易算的工具,其实选用另一种理想历法并无不可。(按一般历史书的记法,1582年10月4日及以前的普遍用儒略历,1582年10月15日的用格列哥里历,今从此)。 三、 公元日序数的算法: 1、公元1582年10月4日前日子的公元日序数求法: 不难按历法知道: 公元日(P)=365*(年号(Y) -1)+闰年数+ 本年的日数 根据儒略历四年一闰的法则(逢被4整除的均置闰)得: P = 365*(Y-1)+ [ Y/4] + Q 式中“[ ]”是取整符号;Q是从要算的日子到1月1日的天数加1,由于公历的月份有固定的天数,1、3、5、7、8、10、12是大月31天,4、6、9、11日小月30天,2月份置闰月严格按28天算,(为了直观些,稍后我会用坐标来移及一些数学方法,表述成一条用月、日表示的代数式)。 值得注意的是:闰年时,未到3月1日要减1。 例1、 公元227年5月4日的公元日序数是:365*226+[227/ 4]+31+28+31+30+4=82670 例2、 公元1582年10月4日的公元日序数是:365*1581+[1582/4] + 31*5+30*3+28+4 =577737 2、公元1582年10月15日后的日子的公元日序数求法: 公元1582年10月15日是公元1582年10月4日的后一天,故其公元日577738(见例2),格列哥里历按四年一闰,被4整除的均置闰,但逢百年时需被400整除的方置闰,其它百年不置,故四百年有97闰。公式为: P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q+15-3-10 =365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2 式中第2、3、4项是格列哥里历的置闰方法。我们可以对照比1582年以前的置闰方法,多了- [Y/100] +[ Y/400]一项,故需减去 - [1582/100]+[1582/400]以校正之;同时从1582年10月4日到1582年10月15日之间跳过了10日,所以同时减去10,使公元日连续。大家可以代入验算一下,它与此1582年10月4日的序数是连续的。 例3、 公元1582年10月15日的公元日序数: 365*1581+[1582/4] - [1582/100] + [1582/400] + 31*5+30*3+28+15+2 =577738 例4、 公元2003年4月2日的公元日序数: 365*2002+[2003/4] - [2003/100] + [2003/400] + 31+28+31+2+2 =731309 3、公元前日子的公元日序数求法: 尽管儒略历在公元前46年完成,但以前的日期一般的历史书均按儒略历上推,所以也从约定俗成。儒略历按四年一闰,其公式是: 公元日序数=365*年号(负号)+闰年数(负号)+本年的日数(正号) P= -365*Y - [(Y+3)/4]+Q 公元前的求法与公元后的有所不同:后者的计算方向从年、从月、从日是一路远离原点的;前者则是“年”远离了原点,月、日反过来接近原点,这点大家要记住。 (如果选取一个很前的原点,则可以使序数的方向永远为正,但为了便于一般人理解及习惯,我还是放弃了这样叙述------事实上太初历等古代历法一般选取一个很远的天文日作原点的) 例5、 公元前1年1月1日的公元日序数是:-365*1- [(3+1)/4 ]+1= -365 例6、 公元前202年2月28日的公元日序数:-365*202 – [(202+3)/4] + 31+28= -73722 我们把三个公式并列如下: (公式1) P= -365*Y - [(Y+3)/4]+Q (公元前) P = 365*(Y-1)+ [ Y/4] + Q (公元后至1582年10月4日) P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2 (1582年10月15日后) (以下一段选读) 事实上我们可将坐标“平移”,将原点移到公元1年2月28日。将3月1日“作为”一年的开端,平移的目的是为了使置闰放在一年的最后一天,减小置闰对各月份的影响。(事实上我开始推导时是用这方法的,求得结果后才平移成现在的方式)如此,作月份相应减小2,(3=1,4=2,…………1月等于上年的11月,2月是12月),公元日序数则相应增加59。如此则Q的值也可用相关的月(M)、日(D)代数式表示: Q=30(M-1)+[0.6(M-1)+0.5] +D (这纯是个数学问题,我不想在这里证明。反正是十二个月,大家直接代入看看) 如此变换后的公式变为:Y年M月D日 (M为正常月减2,1月时为11月) (公式二) P= -365*Y - [(Y+3)/4]+30M+[0.6M-0.1]+D+29 (公元前) P = 365*(Y-1)+ [ Y/4] + 30M+[0.6M-0.1]+D+29 (公元后至1582年10月4日) P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] + 30M+[0.6M-0.1]+D+31 (1582年10月15日后) 四、干支的求法 知道了一个日子的公元日序数是,要求该日子的干支序数是一个很容易容易的事了,思路是: 一已知干支的日子———推出原点的干支序数———推出任一历史日子序数 (读者诸公一定想到用类似的方法求有固定周期的朔望了) 不难知: 历史日子的干支序数= (原点的干支序数+ 公元日序数)除以60取余数 K=(‘K + P)mod 60 利用例4,公元2003年4月2日的公元日序数是731309,干支乙巳(序数42)则 42=(‘K+731309)mod 60 ‘K=42-731309= -731267= -47 =13 mod 60 即原点(公元前1年12月31日)的干支序数为13(丙子),我们将结果代入公式一,则 (公式三) K=(13+P)mod 60 例7、 求公元1582年10月15日的干支。利用例3的结果有 K=(577738 + 13)mod 60=11,即该日甲戌。 我们将公式三代入公式一,则 K= (-365*Y - [(Y+3)/4]+Q+13 )mod 60 (公元前) K= (365*(Y-1)+ [ Y/4] +Q+13 )mod 60 (公元后至1582年10月4日) K=(365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +15)mod 60 (1582年10月15日后) 我们当然可以使用数学方法将公式化简,以下是我使用的化简式: (公式四) Y年M月D日(M从三月开始,M相应减2) K= (-5Y-[(Y+3)/4]+30M+ [0.6M-0.1]+ D+42 ) mod 60 (公元前) K=(5Y+ [ Y/4] + 30M+ [0.6M-0.1] + D+37)mod 60 (1~1582:10:4) K=(5Y+ [Y/4] - [Y/100] +[ Y/400]+ 30M+ [0.6M-0.1]+ D+ 39)mod 60 (1582:10:4以后) 我用手上天文台编的三千年公历干支朔望对照表抽样校对了几个日子,准确无误。可见它也是采用同样原理编订的。 反过来,知道干支及大约的月份,求公元日序数(公元历)只是解方程的问题而已。 五、举例及应用 例8、 汉书所说高祖五年(己亥)二月甲午即皇帝位的,该日的公历是多少? 高祖五年己亥是前202年,二月大约在公历3月附近,干支甲午序数31,代入公式四得 -202*5 – [(202+3)/4]+30*1+[0.6M-0. 1]+D+42 =31 mod 60 整理得 -989+D=31 mod 60 D=(31+989 ) mod 60 D=0 mod 60 解出D=0,或60,即该日是3月0日(2月28日),或过60天以后的4月29日。 验算:严格按儒略历四年一闰的算法,公元前202年2月28日的公元日序数为 –73722, -73722+13= -73709 = - 29 =31 mod 60 该日甲午。演算没错!! 六、结语:方法是类似解释几何的的方法: 首先建立一个连续时间坐标, 第二是根据公历的规律建立任意日子到原点间的距离公式(公元日序数) 第三是对于有固定周期的属性(干支、月相等),可从任一已知属性的日子利用与原点的距离推出原点的属性。 第四是根据原点的属性利用某点与原的距离推知该点的属性。 第五公式的化简与选择只是一些技术问题。 我向来粗疏,大家如发觉有逻辑上,或计算上的错误,可告我改正。 |
|
|
|
| |
|
3#
发表于 2004-8-26 19:16 |
只看该作者
其实最重要的是能计算历史日子与原点间的距离。
其实最重要的是能计算历史日子与原点间的距离P,如此一切有固定周期的均可算出: 星期: S=(‘S+P)mod 7 干支: K=(‘K+P)mod 60 二十八宿: H=(‘H+P)mod 28 月相: Mo=(‘Mo+P)mod 29.53059 ‘S、‘K、‘H、‘Mo等都是原点的属性,可用待定系数法求出。 [此贴子已经被作者于2003-4-4 13:04:15编辑过] |
|
|
|
| |
     |
4#
发表于 2004-8-26 19:16 |
只看该作者
我晕! 我向来对数字和符号头痛! 看来只好叫兄台换算好后告诉我啦!  |
|
|
|
| |
   |
5#
发表于 2004-8-26 19:16 |
只看该作者
很高興在國學網的朋友也懂程式設計! 在陳遵媯先生的《中國天文學史》(二)的1373頁 ,有個簡單的換算公式,經過初步驗算,是準確 的。打算用簡單的Perl語言把它寫出來讓大家用 ,如果有朋友懂程式,會把該公式內容以Images 放上來,很希望有朋友能來共襄盛舉!讓我們把 它寫出來! |
|
|
|
| |
|
7#
发表于 2004-8-26 19:16 |
只看该作者
英雄所见略同
以下是引用又见南山在2003-4-2 13:31:46的发言:
本来的题目叫“关于公历年月日、农历月相与干支的转化问题”,但后面一半未写成,公式也未选择好,等不及了先写出简单些的。各位都是高人,举一必能反三。我也是边写边修正,大家多提意见。
一、 前提假设:历史上日子干支是连续的
二、 建立时间坐标:
1、 以公元1年1月0日(即公元前1年12月31日)为原点;
2、 坐标单位是日。
3、 历史日子到原点的距离就是该日子的坐标,称为“公元日序数”,原点前的公元日序数为负,原点后的公元日序数为正。例如公元1年1月1日的公元日序数为1,公元前1年1月1日的公元日序数为-1。每个历史日子只有一个公元日。公元日序数是连续的。
说明:建立时间坐标系统,是编制历法、表格的一般性方法。选取公元历作为时间参照系主要是按因应一般使用习惯,它本身只是一种简单易算的工具,其实选用另一种理想历法并无不可。(按一般历史书的记法,1582年10月4日及以前的普遍用儒略历,1582年10月15日的用格列哥里历,今从此)。
三、 公元日序数的算法:
1、公元1582年10月4日前日子的公元日序数求法:
不难按历法知道:
公元日(P)=365*(年号(Y) -1)+闰年数+ 本年的日数
根据儒略历四年一闰的法则(逢被4整除的均置闰)得:
P = 365*(Y-1)+ [ Y/4] + Q
式中“[   ]”是取整符号;Q是从要算的日子到1月1日的天数加1,由于公历的月份有固定的天数,1、3、5、7、8、10、12是大月31天,4、6、9、11日小月30天,2月份置闰月严格按28天算,(为了直观些,稍后我会用坐标来移及一些数学方法,表述成一条用月、日表示的代数式)。
值得注意的是:闰年时,未到3月1日要减1。
例1、 公元227年5月4日的公元日序数是:365*226+[227/ 4]+31+28+31+30+4=82670
例2、 公元1582年10月4日的公元日序数是:365*1581+[1582/4] + 31*5+30*3+28+4 =577737
2、公元1582年10月15日后的日子的公元日序数求法:
     公元1582年10月15日是公元1582年10月4日的后一天,故其公元日577738(见例2),格列哥里历按四年一闰,被4整除的均置闰,但逢百年时需被400整除的方置闰,其它百年不置,故四百年有97闰。公式为:
P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q+15-3-10
 =365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2
式中第2、3、4项是格列哥里历的置闰方法。我们可以对照比1582年以前的置闰方法,多了- [Y/100] +[ Y/400]一项,故需减去 - [1582/100]+[1582/400]以校正之;同时从1582年10月4日到1582年10月15日之间跳过了10日,所以同时减去10,使公元日连续。大家可以代入验算一下,它与此1582年10月4日的序数是连续的。
例3、 公元1582年10月15日的公元日序数:
365*1581+[1582/4]  -  [1582/100] + [1582/400] + 31*5+30*3+28+15+2 =577738
例4、 公元2003年4月2日的公元日序数:
365*2002+[2003/4]  -  [2003/100] + [2003/400] + 31+28+31+2+2 =731309
3、公元前日子的公元日序数求法:
尽管儒略历在公元前46年完成,但以前的日期一般的历史书均按儒略历上推,所以也从约定俗成。儒略历按四年一闰,其公式是:
公元日序数=365*年号(负号)+闰年数(负号)+本年的日数(正号)
  P=  -365*Y - [(Y+3)/4]+Q
公元前的求法与公元后的有所不同:后者的计算方向从年、从月、从日是一路远离原点的;前者则是“年”远离了原点,月、日反过来接近原点,这点大家要记住。
(如果选取一个很前的原点,则可以使序数的方向永远为正,但为了便于一般人理解及习惯,我还是放弃了这样叙述------事实上太初历等古代历法一般选取一个很远的天文日作原点的)
例5、 公元前1年1月1日的公元日序数是:-365*1- [(3+1)/4 ]+1=  -365
例6、 公元前202年2月28日的公元日序数:-365*202 – [(202+3)/4] + 31+28= -73722
我们把三个公式并列如下:
(公式1) P=  -365*Y - [(Y+3)/4]+Q                      (公元前) P = 365*(Y-1)+ [ Y/4] + Q                      (公元后至1582年10月4日) P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +2      (1582年10月15日后)
(以下一段选读)
事实上我们可将坐标“平移”,将原点移到公元1年2月28日。将3月1日“作为”一年的开端,平移的目的是为了使置闰放在一年的最后一天,减小置闰对各月份的影响。(事实上我开始推导时是用这方法的,求得结果后才平移成现在的方式)如此,作月份相应减小2,(3=1,4=2,…………1月等于上年的11月,2月是12月),公元日序数则相应增加59。如此则Q的值也可用相关的月(M)、日(D)代数式表示:
Q=30(M-1)+[0.6(M-1)+0.5] +D
(这纯是个数学问题,我不想在这里证明。反正是十二个月,大家直接代入看看)
如此变换后的公式变为:Y年M月D日  (M为正常月减2,1月时为11月)
(公式二)
   P=  -365*Y - [(Y+3)/4]+30M+[0.6M-0.1]+D+29                 (公元前)
P = 365*(Y-1)+ [ Y/4] + 30M+[0.6M-0.1]+D+29           (公元后至1582年10月4日)
P=365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] + 30M+[0.6M-0.1]+D+31 (1582年10月15日后)
四、干支的求法
知道了一个日子的公元日序数是,要求该日子的干支序数是一个很容易容易的事了,思路是:
 一已知干支的日子———推出原点的干支序数———推出任一历史日子序数
(读者诸公一定想到用类似的方法求有固定周期的朔望了)
 不难知:
  历史日子的干支序数= (原点的干支序数+ 公元日序数)除以60取余数 
 K=(‘K + P)mod 60     
                       
利用例4,公元2003年4月2日的公元日序数是731309,干支乙巳(序数42)则
42=(‘K+731309)mod 60      ‘K=42-731309= -731267=  -47 =13  mod 60
即原点(公元前1年12月31日)的干支序数为13(丙子),我们将结果代入公式一,则
(公式三) K=(13+P)mod 60
例7、 求公元1582年10月15日的干支。利用例3的结果有
K=(577738 + 13)mod 60=11,即该日甲戌。
我们将公式三代入公式一,则
K= (-365*Y - [(Y+3)/4]+Q+13 )mod 60                      (公元前)
K= (365*(Y-1)+ [ Y/4] +Q+13 )mod 60                 (公元后至1582年10月4日)
K=(365*(Y-1)+ [Y/4] - [Y/100] +[ Y/400] +Q +15)mod 60      (1582年10月15日后)
我们当然可以使用数学方法将公式化简,以下是我使用的化简式:
(公式四) Y年M月D日(M从三月开始,M相应减2)
K= (-5Y-[(Y+3)/4]+30M+ [0.6M-0.1]+ D+42 ) mod 60             (公元前)
K=(5Y+ [ Y/4] + 30M+ [0.6M-0.1] + D+37)mod 60                     (1~1582:10:4)
K=(5Y+ [Y/4] - [Y/100] +[ Y/400]+ 30M+ [0.6M-0.1]+ D+ 39)mod 60    (1582:10:4以后)
我用手上天文台编的三千年公历干支朔望对照表抽样校对了几个日子,准确无误。可见它也是采用同样原理编订的。
反过来,知道干支及大约的月份,求公元日序数(公元历)只是解方程的问题而已。
五、举例及应用
例8、 汉书所说高祖五年(己亥)二月甲午即皇帝位的,该日的公历是多少?
高祖五年己亥是前202年,二月大约在公历3月附近,干支甲午序数31,代入公式四得
-202*5 – [(202+3)/4]+30*1+[0.6M-0. 1]+D+42 =31 mod 60
整理得  -989+D=31 mod 60   D=(31+989 ) mod 60   D=0  mod 60
解出D=0,或60,即该日是3月0日(2月28日),或过60天以后的4月29日。
验算:严格按儒略历四年一闰的算法,公元前202年2月28日的公元日序数为 –73722,
-73722+13= -73709 =  - 29 =31 mod 60 该日甲午。演算没错!!
六、结语:方法是类似解释几何的的方法:
首先建立一个连续时间坐标,
第二是根据公历的规律建立任意日子到原点间的距离公式(公元日序数)
第三是对于有固定周期的属性(干支、月相等),可从任一已知属性的日子利用与原点的距离推出原点的属性。
第四是根据原点的属性利用某点与原的距离推知该点的属性。
第五公式的化简与选择只是一些技术问题。
我向来粗疏,大家如发觉有逻辑上,或计算上的错误,可告我改正。
求y年m月d日世界时正午的儒略日JD: 儒略历: JD=365*(y-1)+[y/4] +30*(m-3)+[0.6*(m+1)]-2 +d +1721482.0 格里历: JD=365*(y-1)+[y/4]-[y/100]+[y/400] +30*(m-3)+[0.6*(m+1)]-2 +d +1721484.0 说明: 1)凡1月、2月视为上一年的13月、14月; 2)公式中[x]=不大于x的最大整数, 如[5]=5,[5.2]=5,[5.8]=5,[0]=0,[-5]=-5,[-5.2]=-6,[-5.8]=-6; 3)计算公元前日期时,年份BC1,BC2,BC3...视为0,-1,-2...,而月份、日序仍然作正数; 4)儒略日是以日为单位的不间断的纪时方法,以儒略历公元前4713年1月1日世界时正午为儒略日起算点; 5)一些特殊日期: BC4713.1.1=JD0.0(该日是星期一,癸丑日) AD1.1.1=JD1721424.0 AD1582.10.4=JD2299160.0 AD1582.10.15=JD2299161.0; 6)AD1582.10.4的次日为AD1582.10.15,从此行用格里历。对于此前的日期习惯上一律按照儒略历推算,而不考虑罗马历法的实际施行情况; 7)本法较适用于编为程序应用,稍加补充后即可应用于星期及日干支的计算。 1998年前后我为计算儒略日曾经求出上述公式,其中对日期的处理自认为颇具巧思,现在看了阁下“关于公历年月日与干支的转化问题”一文,真是英雄所见略同啊! |
|
|
|
| |
|
8#
发表于 2004-8-26 19:16 |
只看该作者
我有一本“张氏公元万年甲子纪日速算法”,作者是张致中、张幼明。重庆出版社出版,我这本儿是82年出的。可以找找。 |
|
|
|
| |
  |
10#
发表于 2004-8-26 19:16 |
只看该作者
久违了!很高兴又见“南山”兄大作。 关于“公历”年月日公元前日期与中国历史纪年的干支转换问题,希望南山兄和各位关心这个问题的网友共同来统一一下思想: 1大家公认为“公历”的起点日,比如南山兄以之为“原点”的前1年月12月31日这天,其对应的“中历”日期的干支,要公认和统一,有大家的“约法”或“立法”才好。 大作以之为例子该日干支为“丙子”,我也是如此认定的。但权威的资历料不是这样表述的。如1989年版《辞海》附《中国历史年表》,还有台湾中央研究院计算中心网站公布的《中西历转换工具》(ASCC),按它们确指为公(西)元元年1月1日对应日期的干支为“戊寅”。如用此反溯一日,南山兄作为例子的前1年1月31日干支则不是“丙子”而另为“丁丑”日了!? 2、中历向上与“公历”向上反溯的“公历”日期,也要公认一条“规则”才行。作为“规则”较密近天象,自然以“格里高利”为优。但多以“儒略历”规则,也无不可。只是要求统一。问题出在:公认的权威数据,却是来自对公认的“公历”来源于《儒略历》以前发生的历史的默契和肯定。按《儒略历》规则,四年当置一闰日(于2月为29天)。可从上举两份权威资料的日期安排看,公历1年至7年间,却未应期安排“闰日”。表上连着七年,每年的2月都是28天。 关于中国历史日期与“公历”反溯对照,与天象密近否,有关系,但更重要的是统一,才有标尺。不知诸兄以为然否? |
|
|
|
| |
|
11#
发表于 2004-8-26 19:16 |
只看该作者
兄好,这是旧年的贴子了。近几个月为口奔波,已很少时间上网,更不要说发贴了。等四月份稍闲,再与君一聚。 |
|
|
|
| |
|
12#
发表于 2004-8-26 19:16 |
只看该作者
先把日干支与儒略日对应起来。这个对应简单明了,不会造成混乱。 然后要把儒略日“翻译”成儒略历还是格里历,就按各自的约定而行。 格里历通行之后用格里历自然没有问题;儒略历通行的年代用儒略历也没有问题。 问题是儒略历通行之前的年代,该用什么历?也即中国先秦的日期翻译成公历应该用什么历? 有人主张用格里历,我以为不顺。用儒略历更为合理。 |
|
|
|
| |
 |
13#
发表于 2004-8-26 19:16 |
只看该作者
以下是引用水電工2在2003-4-3 13:38:13的发言:
在陳遵媯先生的《中國天文學史》(二)的1373頁
,有個簡單的換算公式,經過初步驗算,是準確
的。
这本书好难找呵,网上没有,家里有一本第三册。偶又只有上海图书馆的外借证。外借室里好象没有。 有这本书的朋友能不能把这个公式贴出来呵? 偶也想知道呵! [此贴子已经被作者于2004-3-1 23:24:24编辑过] |
|
|
|
| |
 |
14#
发表于 2004-8-26 19:16 |
只看该作者
地支对应黄道十二星座。 这黄道十二星座由于岁差的作用,每2148-2160逆时针移动一位。 所以,这干支应该也是2148-2160年一变的。 我的想法是,天干方位不变(因为天干代表地球五行),地支每2148年或2160年前移一位。在排列上是这样的: [第一个2148年或2160年] 甲乙丙丁戊己庚辛壬癸 子丑寅卯辰巳午未申酉戍亥 [第二个2148年或2160年] 乙甲丁丙己戊辛庚癸壬 丑寅卯辰巳午未申酉戍亥子 [第三个2148年或2160年] 甲乙丙丁戊己庚辛壬癸 寅卯辰巳午未申酉戍亥子丑 [第四个2148年或2160年] 乙甲丁丙己戊辛庚癸壬 卯辰巳午未申酉戍亥子丑寅 ......依此类推 以上是个人的一些看法,仅供参考。 (我在用易卦预测中使用,效果很不错。) |
|
|
|
| |
<http://bbs.guoxue.com/viewthread.php?tid=123202>