湘里妹子学术网

 找回密码
 注册
查看: 3626|回复: 1

[下载]公历算干支软件(Win32/exe/29Kb)

[复制链接]
发表于 2003-10-27 19:17:32 | 显示全部楼层 |阅读模式
水電工2     
  
  
--------------------------------------------------------------------------------
等活君提供功的公历算干支软件(Win32/exe/29Kb)
   http://artvine.com.tw/images/d/ganzhi.exe

請等活君說明使用方法!   


  
-------------------------------------------------------------------------------------------------

等活     
  
  
  等级:初学子
  注册:2003-6-22
  文章:44
  鉴定:保密
  

9楼         

--------------------------------------------------------------------------------
  
把文件保存在硬盘上,执行(双击等)它就可以。
按照提示,依次输入所求干支之年、月、日。
公元后年份按实际数字输入,如2003年,即输入2003;
公元前1年为0年,前2年为-1年,依次类推。
例:如依次输入“-1045”,“1”,“20“,结果将为“jiazi 00",即甲子日。

所谓公历,按国际通行规则办,格里高利改历前为儒略历,改历后为现行公历。
当然西周、殷商不存在什么儒略历,但仍旧按照儒略历往前推算,而不用格里高利历。

输出结果如上例,为拼音加一个数字。因为字符串长度的缘故,有的干支拼音并不正确。
本人设定甲子编号为00、乙丑为01、……癸亥为59,与其他约定略有不同,这是为了方便四则运算。

希望能对大家有所帮助。


另,在一次运算结束后,如需要继续求另外一个日期的干支,即输入“1”,否则输入“0”终止程序。
 楼主| 发表于 2003-10-27 19:18:57 | 显示全部楼层

公历日期推干支的一种算法

七秩龄童

-----------------------------------------------------------------------------------------------------------------

要求推算日期者先熟悉公历的月大、月小、四年一个闰日和百年25个闰日的基本规则,同时请注意公历实施历史上的以下变动、变故和修订:
1)按儒略历规则,公元前置闰的年份为前1、5、9、13、17、21……以及其加4和4的倍数的年份,而世纪闰年的年份也迭变为“前1、××1、××01”之年。
2)公元1582年10月4日,实施新的格利历规则,规定其第二天为10月15日,为公历历史上留下10天空白的缺陷。这一天对应于明朝的万历十年九月十八日干支癸酉。
3)从公元1582年10月15日(干支甲戊)起实施的格利历规定每400年只安排97闰,至今已有1700、1800和1900三个世纪之年按新规定改为不闰,2月只有28天,称为世纪缺闰年。(规定凡非400的倍数的世纪年不置闰。)
本算式系由一种心算法提炼整理而成,算式为
N=±U+NO …………(1)
式中 N—以六十甲子顺序表示的所求之日的干支。得数若大于60 ,应减以60,如令68=8等;若得数带负(-)号,表示的是六十甲子的负顺序,为便于认读,可用加以60的办法置换成正顺序,如-37=-37+60=23=丙戊。因为由六十甲子的第末位倒着数,丙戊正好在第37位。
NO—作为参照日(已知日)的日干支。依算式随便哪天都可以作支撑点为参照日;本算式以公元元年的元旦日为主参照日,日干支为丁丑(NO=14).另外建议记住:2001年1月1日,星期一,日干支甲子。从2001年元旦日作起点,算二十世纪及其左右日期的干支比较方便。
± ——所求之日在参照日之后置正(+)号,参照日之前置负(-)号。注意这一要求不分公元前或公元后,但若以公元元年的元旦日作参照日,则当推算公元前日期的干支时,自然应当置以负号;而公元后的所有年份则都用正号。
U—若所求日距离参照日的天数为M天,则U=Mmod60,即U为M除以60的余数。所求日期与参照日期相距很近,能方便的直接算出数M当然好,如不便一口答出,则令
U=(U1+U2+U3)mod60……… (2)
式U1——距离日期中当年不足整
年的零星天数除以60的余数;如某平年的 10月 1日,若从元月 1日算起,则其零天数为一季度90天,二季度 91天,三季度92天,共计 273天,如是U1=273mod60=33. U2——距离中的整年以平年计算天数的余数。平年一年的天数为365日,除以60的余数为5;若相距的整年为n,则:
U2=(365n)mod60=(5n)mod60。
U3——相距期间闰日和缺空日的调整日数除以60的余数。从公元元年至公元前第n整年的闰日数为[n+3/4];式中[ ]表只取其中数值的整数,如[8.1]=[8.9]=8等。从公元元年至公元第n整年期间的闰日数则为[n/4]。
注意:若计算从公元n1 整年至公元第n2整的闰日数,应由n2的闰日数减n1的闰日数的方法求之,不能以公元年号相减的结果再取其除以4的整除数。以公元后为例,式为[n2/4]-[n1/4]。U3则只取闰日数除以60的余数;如公元前年份U3= [n+3/4]mod60;公元后的年份,则 : U3=[n/4]mod60,or U3 =([n2/4]-[n1/4])mod60等。公元1582年10月15日及以后的U3还要减一个修正定数δ,请参看例题6)的补充。为指导具体日期的算法,以算例明之。
例题
1) 推公元前1065年3月13日的记日干支?
公元前1065年3月13日至12月31日的天数为295日;从公元元年元旦日算起,至公元1065年3月的13日,共相距1064年零295日。因此 : U1=295mod60=55;又相距的整年为1064年,因此:
U2= (365X1064)mod60=(5X44)mod60=220mod60=40;
又由前1064年至公元元年的闰日为[1064+3/4]=[1067/4]=266,所以
U3=(266)mod60=26。 结果代式(2)得:U=(U1+U2+U3)mod60=(55+40+26)mod60 =(121)mod60=1
U=1的结果 代入式(1)得: N=-1+14=13=丙子。 据《中国天文学史·二章·四》,1065年3月13日为夏正正月“丙子拜望月食”之日。

2)推前1052年1月4日的记日干支?
分析:前1052年的零天为365-3=362天;前1052年1月4日至公元元年元旦日距离为1051整年零362日,理同例题2),得:
U1=362mod60=2;
U2=(365X1051)mod60=(5X31)mod60=(155)mod60=35;U3=([1051+3/4])mod60=(263)mod60=23。
上结果代入式(2), U=(2+35+23)mod60=(60)mod60 =0
代入式(1)得:N=-0+14=14=丁丑.查密近天象的前1052年建丑之月(夏正十二月)朔日为丁丑。《帝王世纪》记为周正月丙子朔,相隔一天。
3)推前1046年1月20日的记日干支?
分析:前1046年的零日数为365-19=346日,因之距公元元年元旦日为1045年零346日。故:
U1=346mod60=46mod60=46; U2=(365x1045)mod60=(5x25)mod60=125mod60=5;
U3=([1045+3/4])mod60=(262)mod60=22;代入式(2),得: U=(U1+U2+U3)mod60=(46+5+22)mod60=73mod60=13. 代入式(1)得:N=-13+14=1=甲子。前1046年1月20日为《夏商周三代年表》断定的“二月甲子”周武王伐纣克商于牧野之日。
4)推公元前202年分2月28日的记日干支?
分析:前202年零日数1+31+91+92+92(2月28日1天+3月+3个季度)=307日,总计距公元元年的元旦日为201年零307日,所以:
U1=307mod60=7;
U2=(365x201)mod60=(5x21)mod60=105mod60=45;
U3=([201+3/4])mod60=51。代入式(2)得: U=(7+45+51)mod60=104mod60=43。 代入式(1)得:
N=-43+14=-29=-29+60=31= 甲午
这一天是《史 记》载汉刘邦五年夏正“二月甲午(初三日)王更号,即皇帝位于定陶”的公历日期。
5)推公元1582年10月4日的记日干支?
该日距公元元年元旦日为1581整年零276日,(1季90+2季91+3季92+10月3天)所以:
U1=276mod60=36;
U2=(365x1581)mod60=(5x21)mod60=105mod60=45;
U3=([1581/4])mod60=395mod60=35。得数代入式(2):
U=(36+45+35)mod60=116mod60=56
已知NO=14,同代入式(1)得:N=+56+14=70=10=癸酉。
6)由公元元年旦日干支丁丑(NO=14)推公元1601年1月1日的记日干支?
分析:求法与例题5)并无不同,唯因跨过了1582年10月4日的格利高里线,有10天空白,须命U3=([n/4]-δ)mod60;式中δ为修正定数,若仍从公元元年入算,依推算的年份不同,其δ数为:
1582年10月15日以后:δ=10;
1700年3月1日及以后:δ=11;
1800年3月1日及以后:δ=12;
1900年3月1日及以后:δ=13;
2100年3月1日及以后:δ=14;等。
本例题要求以公元元年的元旦日为参照日,距1601年元旦日为整1600年无零日,所以 U1=0;而
U2=(365x1600)mod60=(5x40)mod60=200mod60=20;
1600整年闰[1600/4]=400日,δ=10,所以:
U3=(400-10)mod60=30.代入式(2),得:
U=(0+20+30)mod60=50.
代入式(1),得:N=50+14=64=4=丁卯.
7)推1949年10月1日的记日干支?要求用两个参照日各解.
(解一)由公元元年元旦日(NO=14)切入,按虚日计算,相距为1948整年零273天(90+91+92),
U1=273mod60=33;
U2=(365x1948)mod60=(5x28)mod60=140mod60=20;
以1948整年计的闰日数为: [1948/4]=487(闰日), 而修正定数为
δ=13,所以:
U3=(487-13)mod60=474mod60=54. 代入式(2)得:
U=(U1+U2+U3)mod60=(33+20+54)mod60
=107mod60=47.代入式(1),得:
N=+47+14=61=1=甲子。
(解二)由2001年元旦日甲子(NO=1)切入:1949年10月1日到12月31日的余日为92日(31+30+31)期间相距51年零92日。所以:
U 1=92mod60=32;
U2=(365x51)mod60=(5x51)mod60=255mod60=15;
由公元4年至2000年的闰日数为[2000/4]-3=497闰日,而至1948年的闰日数为[1948/4]-3=484闰日,从而得相距50整年间的闰日数为497-484=13闰日。于是:U3=13。代入式(2),得: U=32+15+13=60=0 (和不大于60,不必相除,所以U的式子中未写mod60的形式.)
代入式(1),注意所求日因在参照日之前,U前应置 - (负)号, 得:
N= - U+ NO= -0 + 1 = 1 = 甲子.(两解结果相同!)
8)推1997年7月5日的记日干支?
分析:7月5日当年的余下的零日为92+92-4=180日.(三、四季度184天减7月份4天) 距离2001年元旦日为3整年又零180日,故:
U1=180mod60=0;
U2=(365x3)mod60=(5x3)=15;
U3=1 (期间仅闰2000年1日,省用算式另算)
U=0+15+1=16,NO=1,代入式(1):
N= -16+1= -15 =-15+60 = 45 = 戊申.



[此贴子已经被作者于2003-5-10 12:38:54编辑过]  


--------------------------------------------------------------------------------
  发贴时间: 2003-5-10 12:38:54     


  


七秩龄童     
  
  
  等级:俊才
  注册:2003-4-19
  文章:371
  鉴定:保密
  

2楼         

--------------------------------------------------------------------------------
  用干支算式算星期等……
·  附题一:用算干支的算式算星期
·  七秩龄童
·  七秩龄童曾经放话,谓算公历日期的算式可以一式多用。其一是查公历日期的星期,虽不是难题,我曾查过手册,如湖北出版社1989年版《中国文化知识精华》载的《星期万年历》,稍作核对,即知还是需要会亲自核算才放心;其二意在表明,算日期干支的算式是经过了高度概括的,有较普遍的适用性,只要是存在周期性内在规律性变化的现象,都有囊括进来加以表述的可能。
·  推日期星期的算式为
N=±U+NO ………… (1)
式中:N — 这儿为所求日期的星期。得数若大于7,需减以7,例如得数为9=9-7=2=星期二等是;若得数为负,表示为星期的负顺序,需用加7的办法置换成正顺序,如-9=-9+7=2=星期等是。
NO — 作为参照点的已知日期的星期。按算式可以选定自已熟悉的日期为参照点;但本文以公元元年的元旦日(1月 1日)星期六(NO=6)作为切入的参照日期.若由其它日期切入,则另作申明.
± — 所求日期在参照日之前置负(-)号,在参照日之后则置正(+)号;本要求不分公元前或公元后,但若以公元元年1月 1日为参照日,则公元前自然用负(-)号,而公元后必用正(+)号。
U — 若所求日期与参照日期相距为M天,则U=Mmod7,即U为相距日期除以7的余数。若M数不容易一口答出,则令:
U=(U1+U2+U3)mod7 ………… (2)
式中 U1—求算日期距离的天数M在当年的零天数除以7的余数。例如某年10月1日,从1月1日算起,则零天数为三个季度,为90+91+92=273天,如是U1=273mod7=0 (or 7,因在这儿,7=0)
U2 — 相距离天数中的整年数以平年算的天数除以7的余数。相距天数中的整年数为n ,其天数为365n,因为365÷7=52……1,所以
U2 = (365n)mod7 = (n)mod7.
U3 —距离整年数中的闰日数和空缺日期天数
除以7的余数。若为公元前,闰日数为[n-3/4], [ ]表示只
留除商的整数,例如[8.1]=[8.9]=8等是;若为公元后,闰
日数为[n /4]。于是U3=[n-3/4]mod7 或 U3=[n/4]mod7。
若从公元元年作星期计算的起点,则所求日期在1582年10月15日及之后,U3还得减以因空缺日和缺闰而产生的修订单系数δ,请参看题例3中的有关补充。以下用题例及解以说明具体问题的算法。
题例

1 公元前45年1月1日,相当于汉元帝初元三年十一月二十九日庚辰,罗马恺撒实施儒略历。试追溯其为星期几?
前45年1月1日距公元年1月1日(星期六)为整45年,U1=0;U2=45mod7=3; U3=[45+3/4]mod7=12mod7=5
代入式(2),得: U=(U1+U2+U3)mod7=(0+3+5)mod7=1.
又NO=6,代入式(1)得: N=-1+6=5=星期五.
2由公元元年元旦日为星期六推算公元1582年10月4日为星期几?
由1582年元旦日至10月4日距离三个季度加3天,为
90+91+92+3=276天,则期间相距为1581年零276天。如是:
U1=276mod7=3; U2=1581mod7=6; U3=[1581/4]mod7=395mod7=3.
代入式(2),得:U=(U1+U2+U3)mod7=(3+6+3)mod7=5.代入式(1),得:N=5+6=11=11-7=4= 星期四。
3推题例2的次日,即1582年10月15日的星期?
因为跨过了格利高更历线,U3=([n/4]-δ)mod7,其中
δ—为空白日缺闰日的修订值,如下;
日期为:1582年10月15及以后的整年数, =10;
1701年3月 1日及以后的整年数, =11;
1801年3 月1日及以后的整年数, =12;
1901年3月1日及以后的整年数, =13;
2101年3月1日及以后的整年数, =14 ;等。
此题的零天数仍当没有空缺日计,为273+14=287天,因之
U1=287mod7=0; U2=1581mod7=6;
U3=([1851/4]-10)mod7= (395-10)mod7=385mod7=0.
代入式(2),得:U = 0+6+0 = 6 ,代入式(1),得:
N=6+6=12=12-7=5=星期五。
4推1840年1月1日为星期几?
距公元元年1月1日(NO=6)为整1839年,故U1=0; U2=1839mod7=5;
U3=([1839/4]-12)mod7=(459-12)mod7=447mod7=0
代入式(2),得U=0+5+0+5;代入式(1),得:
N=5+6=11=11-7= 4=星期四。
5公元2001年元旦日为星期一,(NO=1)试由此日切入,推 2008年9月10日的星期?
2008年的零天为一季+二季+7、8两个月+9天=90+91+62+9=252天,由2001年1月1日算起,得期间距离为7整年零252天,于是U1=252mod7=0; U2 =7mod7=1;又期间只有2004年一个闰日,因而得U3=1。代入式(2)得:U=0+1+1=2。代入式(1),得:N=2+1=3=星期三。
自娱项目-设制元旦日星期万年历
一、 由公元元年元旦日起,止于2001年,算出每个世纪元年元旦日的星期,得一列数为6、5、4、3、2、1、7、6、5、4、3、2、1、7、6、5、1、6、4、2、1,填于一画了21行表格的第一列;
二、 从元年元旦日起,算出每距10年元旦日的星期,得一列数为:(6)、4、3、1、7、5、4、2、1、6;
(5)、3、2、7、6、4、3、1、7、5。
·  将上数填入于有10列表格的第一和第二行。上数中括号里的数因第一步已填入,第二步不填重复。
边填边摸变化的规律,将每十年元旦日的星期填充满。注意从1591年起数列格局的变动!
三、 仿《三角函数表》于表眉设制一个《年元旦日星期添加数 》共三行。第一行名:年号四位数;数:1、2、3、4、5、6、7、8、9、0。第二行名:年号三位数02468;数:0、1、2、3、5、6、7、1、3、4。第三行名:年号三位数13579;数:0、1、3、4、5、6、1、2、3、4。三行之数须对正填好。
又仿《周期元素表》于1581年格中的数“7”上角注以*号,于表脚标*号的处所列出(15)81、82、83、84、85、86、87、88、89、90对应元旦日的星期:7、1、6、7、2、3、4、5、7、1。
四、经校核后用彩色修饰完成。(如有兴致,可依法设计《星期万年历》,并不难。又及。)

附题二:由公元年号推年干支的算式和中口诀
算式—
公元前:N= (- n –2)mod60………… (1)
公元后:N = ( n-3 ) mod60………… (2)
式中n为公元年号,N为所求年对应的六十甲子顺序数。式(1)中,得数如为负(-),则表示是六十甲子的顺序;为便于认读,可以将得数加以60,以置换成正顺序。式(2)的得数如大于60,应减以60处理之。
口诀四句—
公元甲子无玄妙,余数减三是诀窍;
年号若在公元前,余数加二带反号。
[ 自注]:文中NO、U1、U2、U3其O、1、2、3都是下脚码,上传中变了样子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|湘里妹子学术网 ( 粤ICP备2022147245号 )

GMT++8, 2024-3-29 22:56 , Processed in 0.123678 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表