最近整理算法是发现lunar的八字计算命宫与其他软件计算有差异,查询了具体描述以后调整了算法。
命宫描述与计算方式如下:
命宫在人体中属大脑,管一个人的思想、行为,非常重要。凡推命宫,须以生月之数(如过中气,作次月之数推。)与生时之数合算。寅一,卯二,辰三,巳四,午五,未六,申七,酉八,戌九,亥十,子十一,丑十二,以十四为本位。如月之数不满十四当加之,加到十四为止。即以所加之数,为某宫。如满十四数者。当加至二十六,为本位。亦以所加之数为某宫。或以十四减去月令时辰之总和,所余之数,即为命宫。欲知某宫之干,再以年干遁之。与年上起月法同。
列式如下:14-(月令(过候加一)+时辰)=命宫26-(月令(过候加一)+时辰)=命宫由于命宫是人出生时在东方升起的星座,故此法只适用于北纬三十度以下,日出为卯时的地区。
php的算法调整如下:
/**
* 获取命宫
* @return string 命宫
*/
public function getMingGong()
{
$offset = LunarUtil::index($this->getMonthZhi(), self::$MONTH_ZHI, 0) + LunarUtil::index($this->getTimeZhi(), self::$MONTH_ZHI, 0);
$month_no = LunarUtil::index($this->getMonthZhi(), self::$MONTH_ZHI, 0) -1;
$wuhouno = LunarUtil::index($this->lunar->getWuHou(),LunarUtil::$WU_HOU,0);
if ($wuhouno > $month_no*3){ $offset = $offset+1;} //过候加1
$offset = ($offset >= 14 ? 26 : 14) - $offset;
$ganIndex = ($this->lunar->getYearGanIndexExact() + 1) * 2 + $offset;
while ($ganIndex > 10) {
$ganIndex -= 10;
}
return sprintf('%s%s', LunarUtil::$GAN[$ganIndex], self::$MONTH_ZHI[$offset]);
}
增加的代码为:
$month_no = LunarUtil::index($this->getMonthZhi(), self::$MONTH_ZHI, 0) -1; //根据地址查询月份,减掉1作为计算物候的位置
$wuhouno = LunarUtil::index($this->lunar->getWuHou(),LunarUtil::$WU_HOU,0);//当前物候的位置
//每个节气3个物候,如果获取的物候超过了当前节气的3个物候为过侯
if ($wuhouno > $month_no*3){ $offset = $offset+1;} //过候加1