生辰八字、天干地支、五行纳音、大运流年、十神及二十四节气排盘:js源码
节气历法和算命程序常常会使用到天干地支的计算规则,具体算法很多,各有千秋,主要差异还是精准度。
中国古代历法有上百次调整和修正,所以还原之前的干支历和天象节气工作量还真不少。主要节点包括:一是算出正确的年月日时干支,二是算出正确的节气时点,传统历法中的属相换年都跟冬至有关。
节气推算
公式:[Y*D+C]-[Y/L]
公式解读:Y=年数后2位,D=0.2422,L=闰年数,C为节气参整参数,每个节气的参数都不相同,如立春:21世纪C值为3.87,22世纪C值为4.15。
举例说明:2058年立春日期=[58×.0.2422+3.87]-[(58-1)/4]=17-14=3,则2月3日立春。
年月日时干支推算
干支历以60甲子作循环,日期循环规律性很强,所以算法多种多样。
一、年干支算法:
年份÷10看余数。所得的余数与天干的对应关系为甲1、乙2、丙3、丁4、戊5、己6、庚7、辛8、壬9、癸0
上年份数÷12看余数。余数与地支的对应关系为子、丑2、寅3、卯4、辰5、巳6、午7、未8、申9、酉10、戌11、亥0(公元前的年份用“58减去年份数除以60的余数”后计算)。
二、月的干支算法:
由年干支推算月干支,排表后可直接取值。
年干支与月干支有固定的对应规律,推算方法有著名的“五虎遁”,又叫“五虎遁年起月歌”。
例如2002年9月,年干支为壬午,对应月干支则为戊申。
三、日干支算法:
计算日干支的公式:
先算日干。
Y = (C-4) × 2 mod 10,其中Y为日干,C为年份的后两位数,用Y的值和地支的值组合起来就可以得到一个时间点的日干支。
日干与日支有固定对应关系,得到日干后,查日干支对照表就可以得到日支。
不用查万年历也可轻松推算出日干支纪。歌诀:
乘五除四九加日,双月间隔三十天。一二自加整少一,三五七八十尾前。
四、时干支算法
时支大家都熟悉了,十二时辰对下十二地支。时地支和时天干也有固定对应关系,得到时地支后,查豆腐乳干支对照表就可以得到辰干。
这样的法,年月日时的干支都算出来了。当然,这只是许多算法中的其中一种。
这里是一个完整的天干地支八字排盘JS版源码片段,值得参考学习的地方包括干支及节气算法的参数定义,以1984年为节点以方便计算,因为1984年是一个有特点的历法年,农历甲子年(鼠年),闰十月,共384天,正好60甲子开头,12属相也正是开头,公历正是闰年。
var jq84=[442208451146,444755924716,447326679845,449936540593,452591457618,455285317308,458000946032,460714673166,463403390187,466051355952,468654332864,471220083199];
var y_d84=441734400726;
function Bazi(y,m,d,h,sex){
var y=Number(y);
var m=m-1;
var d=Number(d);
var h=Number(h);
var sex=Number(sex);
var y_d=new Date();
y_d.setFullYear(y);
y_d.setMonth(m);
y_d.setDate(d);
y_d.setHours(h);
y_d.setMinutes(0);
y_d.setSeconds(0);
var y_t=y_d.getTime();
var tg=["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"];
var dz=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"];
var dz0=["丑","寅","卯","辰","巳","午","未","申","酉","戌","亥","子"];
var jq=["小寒","立春","惊蛰","清明","立夏","芒种","小暑","立秋","白露","寒露","立冬","大雪"];
var jq84=[442208451146,444755924716,447326679845,449936540593,452591457618,455285317308,458000946032,460714673166,463403390187,466051355952,468654332864,471220083199];
var y_d84=441734400726;
var zsss={
甲:["沐浴","冠带","临官","帝旺","衰","病","死","墓","绝","胎","养","长生"],
乙:["病","衰","帝旺","临官","冠带","沐浴","长生","养","胎","绝","墓","死"],
丙:["胎","养","长生","沐浴","冠带","临官","帝旺","衰","病","死","墓","绝"],
丁:["绝","墓","死","病","衰","帝旺","临官","冠带","沐浴","长生","养","胎"],
戊:["胎","养","长生","沐浴","冠带","临官","帝旺","衰","病","死","墓","绝"],
己:["绝","墓","死","病","衰","帝旺","临官","冠带","沐浴","长生","养","胎"],
庚:["死","墓","绝","胎","养","长生","沐浴","冠带","临官","帝旺","衰","病"],
辛:["长生","养","胎","绝","墓","死","病","衰","帝旺","临官","冠带","沐浴"],
壬:["帝旺","衰","病","死","墓","绝","胎","养","长生","沐浴","冠带","临官"],
癸:["临官","冠带","沐浴","长生","养","胎","绝","墓","死","病","衰","帝旺"]
}
var nayi={
甲子:["海中金"],乙丑:["海中金"],丙寅:["炉中火"],丁卯:["炉中火"],戊辰:["大林木"],己巳:["大林木"],庚午:["路旁土"],辛未:["路旁土"],壬申:["剑锋金"],癸酉:["剑锋金"],
甲戌:["山头火"],乙亥:["山头火"],丙子:["涧下水"],丁丑:["涧下水"],戊寅:["城墙土"],己卯:["城墙土"],庚辰:["白腊金"],辛巳:["白腊金"],壬午:["杨柳木"],癸未:["杨柳木"],
甲申:["泉中水"],乙酉:["泉中水"],丙戌:["屋上土"],丁亥:["屋上土"],戊子:["霹雳火"],己丑:["霹雳火"],庚寅:["松柏木"],辛卯:["松柏木"],壬辰:["长流水"],癸巳:["长流水"],
甲午:["沙中金"],乙未:["沙中金"],丙申:["山下火"],丁酉:["山下火"],戊戌:["平地木"],己亥:["平地木"],庚子:["壁上土"],辛丑:["壁上土"],壬寅:["金箔金"],癸卯:["金箔金"],
甲辰:["覆灯火"],乙巳:["覆灯火"],丙午:["天河水"],丁未:["天河水"],戊申:["大驿土"],己酉:["大驿土"],庚戌:["钗钏金"],辛亥:["钗钏金"],壬子:["桑柘木"],癸丑:["桑柘木"],
甲寅:["大溪水"],乙卯:["大溪水"],丙辰:["沙中土"],丁巳:["沙中土"],戊午:["天上火"],己未:["天上火"],庚申:["石榴木"],辛酉:["石榴木"],壬戌:["大海水"],癸亥:["大海水"]
}
var cangdun={
子:["癸",48],
丑:["己",16,"癸",8,"辛",4],
寅:["甲",32,"丙",16,"戊",8],
卯:["乙",48],
辰:["戊",16,"乙",8,"壬",8,],
巳:["丙",32,"庚",8,"戊",8],
午:["丁",48,"己",24],
未:["己",32,"丁",8,"乙",8],
申:["庚",32,"壬",16,"戊",8],
酉:["辛",48],
戌:["戊",32,"丁",8,"辛",8],
亥:["壬",32,"甲",16],
}
this.yGan=function(){ //年干
return tg[(y+6)%10];
}
this.yZhi=function(){ //年支
var nz;
if(y-19840){
((y-1984)%12-1)==-1?nz=dz0[11]:nz=dz0[(y-1984)%12-1];
}
return nz;
}
this.yZhu=function(){ //年柱
return this.yGan()+this.yZhi();
}
this.mGan=function(){ //月干
var ng=this.yGan();
var yg;
if(ng=="甲"||ng=="己") yg=tg[(1+m)%10];
if(ng=="乙"||ng=="庚") yg=tg[(3+m)%10];
if(ng=="丙"||ng=="辛") yg=tg[(5+m)%10];
if(ng=="丁"||ng=="壬") yg=tg[(7+m)%10];
if(ng=="戊"||ng=="癸") yg=tg[(9+m)%10];
if(y_t<((y-1984)*31556926009+jq84[m])){
(tg.indexOf(yg)-1)==-1?yg=tg[9]:yg=tg[tg.indexOf(yg)-1];
}
return yg;
}
this.mZhi=function(){ //月支
var yz=dz0[m];
if(y_t=0?rg=tg[y_r%10]:rg=tg[(4+(60+y_r)%10)%10];
return rg;
}
this.dZhi=function(){ //日支
var y_r=Math.floor((y_t-y_d84)/86400000)%60;
var rz;
y_r>=0?rz=dz0[(5+y_r%12)%12]:rz=dz0[(5+(60+y_r)%12)%12];
return rz;
}
this.dZhu=function(){ //日柱
return this.dGan()+this.dZhi();
}
this.hGan=function(){ //时干
var rg=this.dGan();
var sz=this.hZhi();
var sg;
if(rg=="甲"||rg=="己") sg=tg[(1+dz0.indexOf(sz))%10];
if(rg=="乙"||rg=="庚") sg=tg[(3+dz0.indexOf(sz))%10];
if(rg=="丙"||rg=="辛") sg=tg[(5+dz0.indexOf(sz))%10];
if(rg=="丁"||rg=="壬") sg=tg[(7+dz0.indexOf(sz))%10];
if(rg=="戊"||rg=="癸") sg=tg[(9+dz0.indexOf(sz))%10];
return sg;
}
this.hZhi=function(){ //时支
var sz;
if(h>=0) sz=dz0[11];
if(h>=1) sz=dz0[0];
if(h>=3) sz=dz0[1];
if(h>=5) sz=dz0[2];
if(h>=7) sz=dz0[3];
if(h>=9) sz=dz0[4];
if(h>=11) sz=dz0[5];
if(h>=13) sz=dz0[6];
if(h>=15) sz=dz0[7];
if(h>=17) sz=dz0[8];
if(h>=19) sz=dz0[9];
if(h>=21) sz=dz0[10];
if(h>=23) sz=dz0[11];
return sz;
}
this.hZhu=function(){ //时柱
return this.hGan()+this.hZhi();
}
this.xunKong=function(){ //旬空
var xtg=tg.indexOf(this.dGan());
var xdz=dz.indexOf(this.dZhi());
var xunk;
if((xtg-xdz)==0) xunk=dz[10]+dz[11];
if((xtg-xdz)==-10||(xtg-xdz)==2) xunk=dz[8]+dz[9];
if((xtg-xdz)==-8||(xtg-xdz)==4) xunk=dz[6]+dz[7];
if((xtg-xdz)==-6||(xtg-xdz)==6) xunk=dz[4]+dz[5];
if((xtg-xdz)==-4||(xtg-xdz)==8) xunk=dz[2]+dz[3];
if((xtg-xdz)==-2) xunk=dz[0]+dz[1];
return xunk;
}
this.daYun=function(){ //大运
// 大运
var dyg=[];
var tg1=tg.concat(tg);
var dyz=[];
var dz1=dz.concat(dz);
var ng=this.yGan();
var yg=this.mGan();
var yz=this.mZhi();
var dyun=[];
//大运天干
if(((tg.indexOf(ng))%2==0 && sex==1)||((tg.indexOf(ng))%2==1 && sex==0)){
for(var n=(tg1.indexOf(yg))+1; n<20; n++){
dyg.push(tg1[n]);
dyg.splice(8,22);
}
}
if(((tg.indexOf(ng))%2==1 && sex==1)||((tg.indexOf(ng))%2==0 && sex==0)){
tg1.reverse();
for(var n=(tg1.indexOf(yg))+1; n<20; n++){
dyg.push(tg1[n]);
dyg.splice(8,22);
}
}
//大运地支
if(((tg.indexOf(ng))%2==0 && sex==1)||((tg.indexOf(ng))%2==1 && sex==0)){
for(var n=(dz1.indexOf(yz))+1; n<24; n++){
dyz.push(dz1[n]);
dyz.splice(8,26);
}
}
if(((tg.indexOf(ng))%2==1 && sex==1)||((tg.indexOf(ng))%2==0 && sex==0)){
dz1.reverse();
for(var n=(dz1.indexOf(yz))+1; n<24; n++){
dyz.push(dz1[n]);
dyz.splice(8,26);
}
}
for (i in dyg){
dyun.push(dyg[i]+dyz[i]);
}
return dyun;
}
this.qiYun=function(){ //起运
var qiy;
if(y_t<((y-1984)*31556926009+jq84[m])){
var jnianm=(((y-1984)*31556926009+jq84[m])-y_t)/259200000;
var jniann=(y_t-((y-1984)*31556926009+jq84[m-1]))/259200000;
}else{
var jnianm=(((y-1984)*31556926009+jq84[m+1])-y_t)/259200000;
var jniann=(y_t-((y-1984)*31556926009+jq84[m]))/259200000;
}
(sex==1 && y%2==0)?qiy=Math.round(jnianm):qiy=Math.round(jniann);
(sex==0 && y%2==1)?qiy=Math.round(jnianm):qiy=Math.round(jniann);
return qiy;
}
this.liuNian=function(){ //流年
var n=this.qiYun();
var l=parseInt(y)+parseInt(n);
var g,z;
var lgz=[];
for(var n=0;n<80;n++){
g=tg[(l+6)%10];
if(l-19840) ((l-1984)%12-1)==-1?z=dz0[11]:z=dz0[(l-1984)%12-1];
lgz.push(g+z);
l=l+1;
}
return lgz;
}
this.shiShen=function(g){ //十神
var sn;
var cn=tg.indexOf(g);
var shi=tg.indexOf(this.dGan());
if((shi%2)==0){
if((cn-shi)==-5||(cn-shi)==5) sn="财";
if((cn-shi)==-4||(cn-shi)==6) sn="杀";
if((cn-shi)==-3||(cn-shi)==7) sn="官";
if((cn-shi)==-2||(cn-shi)==8) sn="枭";
if((cn-shi)==-1||(cn-shi)==9) sn="印";
if((cn-shi)==0) sn="比";
if((cn-shi)==1||(cn-shi)==-9) sn="劫";
if((cn-shi)==2||(cn-shi)==-8) sn="食";
if((cn-shi)==3||(cn-shi)==-7) sn="伤";
if((cn-shi)==4||(cn-shi)==-6) sn="才";
}
if((shi%2)==1){
if((cn-shi)==-5||(cn-shi)==5) sn="官";
if((cn-shi)==-4||(cn-shi)==6) sn="杀";
if((cn-shi)==-3||(cn-shi)==7) sn="印";
if((cn-shi)==-2||(cn-shi)==8) sn="枭";
if((cn-shi)==-1||(cn-shi)==9) sn="劫";
if((cn-shi)==0) sn="比";
if((cn-shi)==1||(cn-shi)==-9) sn="伤";
if((cn-shi)==2||(cn-shi)==-8) sn="食";
if((cn-shi)==3||(cn-shi)==-7) sn="财";
if((cn-shi)==4||(cn-shi)==-6) sn="才";
}
return sn;
}
this.xingBie=function(){ //性别
var qk;
sex==0?qk="坤造":qk="乾造";
return qk;
}
this.naYin=function(zhu){ //纳音
var na=[];
na=na.concat(nayi[zhu]);
return na[0];
}
this.shuaiWang=function(g,z){ //旺衰
var zz=dz.indexOf(z);
var sr=zsss[g][zz];
return sr;
}
this.wuXing=function(gan){ //五行
var wux="";
if(gan=="甲"||gan=="乙") wux="木";
if(gan=="丙"||gan=="丁") wux="火";
if(gan=="戊"||gan=="己") wux="土";
if(gan=="庚"||gan=="辛") wux="金";
if(gan=="壬"||gan=="癸") wux="水";
return wux;
}
this.cangGan=function(zhi){
var z=cangdun[zhi];
console.log(z);
var zh=[];
for (var i=0;i<z.length; i++){
if(i%2==0)zh.push(z[i]);
}
return zh;
}
this.ng=this.yGan();
this.yg=this.mGan();
this.rg=this.dGan();
this.sg=this.hGan();
this.nz=this.yZhi();
this.yz=this.mZhi();
this.rz=this.dZhi();
this.sz=this.hZhi();
this.xk=this.xunKong();
this.qk=this.xingBie();
}












精选留言