生辰八字、天干地支、五行纳音、大运流年、十神及二十四节气排盘: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();
}


精选留言

生辰
sample
2023-09-06
写留言
签到
投稿
QQ咨询
返回顶部