杨广悟道第一课:年月日时天干地支的计算方法

杨广悟道第一课:年月日时天干地支的计算方法

一、背景说明:

张三说过:世界上最遥远的距离是什么?不是马里亚纳海沟和珠穆朗玛峰的距离,而是知道和做到的距离,是的,一直以来都想写一个系列的文章,介绍易学之术,但是怕写的不好,逻辑不够完美,技术不够精湛,一直拖到现在还没有动手。

为什么说是写一些易学之术呢,因为本人研究易学也有10几年,也略懂计算机编程技术,也想通过技术的编辑技术逻辑一步一步的剖析八字的逻辑。学易的都知道,易经做为中华文化的群经之首,博大精深,命理学分为术和理的部分,就想天龙八部里面扫地僧说,学习相应的武功,都应该有相应的佛法来化解。这里的武功招式就是术,而佛法就是理,通俗的讲就是要学习易学的哲学思维。


二、需求说明:

经常说人的生辰八字,生辰八字是怎么算出来的,通过编程的方式解释生辰八字的计算方法。通过一个人的出生年月日计算出一个人的生辰八字。

首先进行以下名词解释:

八字 :即用干支纪年法表示一个人的出生年月日时。

坤造 :女人(命)的八字叫做坤造,“造”是一个量词。

乾造 :男人(命)的八字叫做乾造。

干支 :上文提及的年干、日干都是天干。与天干对应的叫做地支。

从“天”、“地”二字可知,在八字上面一排的四个字叫做天干、下面一排四个字叫做地支。

四柱 :一个八字从左到右竖着的两个字分别叫做【年柱】、【月柱】、【日柱】、【时柱】。

每一柱都分为上下两个部分,在上的被称作X干、在下的被称作X支。


三、需求分析

如果一个人只知道他的出生年月日和时间,假如一个人是公历1996-07-01 凌晨02点出生。这里的公历又是个知识点,需要做个说明。

很多人认为:农历就是阴历,公历就是阳历,但其实这种说法是不对的。
有的地方用月亮衡量,将月亮从月牙到月圆,再到月牙整个周期定义为一个月, 即月球绕地球一圈的时间。这种方法就形成了“阴历”,也叫“太阴历”。
不过,月球绕地球一圈不是整数天,大约为29天多一些,如果一年也按12个月来算,相当于只有350多天,与四季变化(直接影响农业)相差越来越大,非常不实用。

所以, 阴历后来被大多数人弃用了。 辛亥革命之后,中国开始引进西方的公历,俗称"阳历",“新历”,名称与中国原有的历法相对应,新中国成立后则正式采用公元纪年,也就是公历(阳历)。
  而阴历也叫太阴历,是以月亮围绕地球转动的规律制定的。
  阴历的一个月叫做“朔望月”。每月初一为朔日,十五为望日,“朔望月”是月相盈亏的平均周期。所谓“月有阴晴圆缺”,说的就是这个意思。
  那么,旧有的历法是阴历还是阳历呢?其实都不算。
  中国自古的历法是一种阴阳合历,一般称为“农历”。
  很多人认为农历就是阴历,其实二者还是有差别的。阴历的时间和阳历相比,每年大约差十一天。
  如果完全按照阴历来,可能不出十五年,我们就要在夏天过春节了。
  然而这种情况并没有发生,因为中国的历法中有一项伟大的发明叫“置闰法”。
  每19年中设置7个闰月,有闰月的年份一年383天或384天,称为闰年。比如2016年、2020年都是闰年。
  农历又根据太阳的位置,把一年分为二十四个节气,便于安排农业生产。所以二十四节气来自农历,而非阴历。
  中国的传统节日都是根据阴历设置的。
  如今,属于汉文化圈的人们每年仍要庆祝春节、元宵节、清明节、端午节、中秋节等节日。
  所以说,中国传统的历法是结合了阳历和阴历的一种阴阳历。
  它用置闰法填补了阴、阳历的时间差,又用阳历的规律制定了安排农事的二十四节气。
  在农历的时序中,人们的生活更加和谐一致,春耕秋收也得到了有条不紊的规划。
  日月相合的农历,其实用价值远远超过了其他历法。它不仅仅是一种历法,更是上下求索的炎黄子孙们,千百年来生活经验与智慧的化身。

四、程序实现

1.首先根据一个人的生日,包含时间的1996-07-01 凌晨02点。

  $shengri = new DateTime($pageview['bjson']['birthday']);
  private $calendar;
  function __construct($year, $month, $day, $hour, $minute, $second)
  {
    if ($year === 1582 && $month === 10) {
      if ($day >= 15) {
        $day -= 10;
      }
    }
    $this->year = $year;
    $this->month = $month;
    $this->day = $day;
    $this->hour = $hour;
    $this->minute = $minute;
    $this->second = $second;
    $this->calendar = ExactDate::fromYmdHms($year, $month, $day, $hour, $minute, $second);
  }

根据公历的时间转化为农历:

$lunar = $solar->getLunar();
  public function getLunar()
  {
    return Lunar::fromDate($this->calendar);
  }
public static function fromDate($date)
  {
    $c = ExactDate::fromDate($date);
    $currentYear = intval($c->format('Y'));
    $currentMonth = intval($c->format('n'));
    $currentDay = intval($c->format('j'));
    $hour = intval($c->format('G'));
    $minute = intval($c->format('i'));
    $second = intval($c->format('s'));
    $ly = LunarYear::fromYear($currentYear);
    $lunarYear = 0;
    $lunarMonth = 0;
    $lunarDay = 0;
 foreach ($ly->getMonths() as $m) {
 // 初一
      $firstDay = Solar::fromJulianDay($m->getFirstJulianDay());
      $days = ExactDate::getDaysBetween($firstDay->getYear(), $firstDay->getMonth(), $firstDay->getDay(), $currentYear, $currentMonth, $currentDay);
 if ($days < $m->getDayCount()) {
        $lunarYear = $m->getYear();
        $lunarMonth = $m->getMonth();
        $lunarDay = $days + 1;
 break;
      }
    }
 return new Lunar($lunarYear, $lunarMonth, $lunarDay, $hour, $minute, $second, Solar::fromDate($date), $ly);
  }

四柱之年柱:年干支计算理论:


因为天干和我们现行的公元纪年都是符合十进制进位法的,所以我们可以推断出公元纪年尾数相同的,则天干应该是一样的。已经确认公元元年系我国西汉平帝元始元年,是年辛酉,根据60甲子一轮回,西汉平帝元始4年即是甲子年。依此类推,可以得到天干对应序数表。

杨广悟道第一课:年月日时天干地支的计算方法

$GAN = array('甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸');
$ZHI = array('子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥');
举例:求1911年干支。
解答:(1911-4)%10=7,天干为辛;(1911-4)%12=11,地支为亥。故1911年为辛亥年。(数组的index从0开始,您应该懂的)


代码如下

只需要计算yearGanIndex和yearZhiIndex,在根据

 private function computeYear()
  {
 //以正月初一开始
    $offset = $this->year - 4;
    $yearGanIndex = $offset % 10;
    $yearZhiIndex = $offset % 12;
 if ($yearGanIndex < 0) {
      $yearGanIndex += 10;
    }
 if ($yearZhiIndex < 0) {
      $yearZhiIndex += 12;
    }
 //以立春作为新一年的开始的干支纪年
    $g = $yearGanIndex;
    $z = $yearZhiIndex;
 //精确的干支纪年,以立春交接时刻为准
    $gExact = $yearGanIndex;
    $zExact = $yearZhiIndex;
    $solarYear = $this->solar->getYear();
    $solarYmd = $this->solar->toYmd();
    $solarYmdHms = $this->solar->toYmdHms();
 //获取立春的阳历时刻
    $liChun = $this->jieQi['立春'];
 if ($liChun->getYear() != $solarYear) {
      $liChun = $this->jieQi['LI_CHUN'];
    }
    $liChunYmd = $liChun->toYmd();
    $liChunYmdHms = $liChun->toYmdHms();
 //阳历和阴历年份相同代表正月初一及以后
 if ($this->year === $solarYear) {
 //立春日期判断
 if (strcmp($solarYmd, $liChunYmd) < 0) {
        $g--;
        $z--;
      }
 //立春交接时刻判断
 if (strcmp($solarYmdHms, $liChunYmdHms) < 0) {
        $gExact--;
        $zExact--;
      }
    } else if ($this->year < $solarYear) {
 if (strcmp($solarYmd, $liChunYmd) >= 0) {
        $g++;
        $z++;
      }
 if (strcmp($solarYmdHms, $liChunYmdHms) >= 0) {
        $gExact++;
        $zExact++;
      }
    }
 $this->yearGanIndex = $yearGanIndex;
 $this->yearZhiIndex = $yearZhiIndex;
 $this->yearGanIndexByLiChun = ($g < 0 ? $g + 10 : $g) % 10;
 $this->yearZhiIndexByLiChun = ($z < 0 ? $z + 12 : $z) % 12;
 $this->yearGanIndexExact = ($gExact < 0 ? $gExact + 10 : $gExact) % 10;
 $this->yearZhiIndexExact = ($zExact < 0 ? $zExact + 12 : $zExact) % 12;
  }

上面的代码做个兼容,就是立春和春节的关系,我们普遍人认为过了春节生肖就变了,其实不是,比如2022年的春节是2月1日,而立春是2月4日,也就是说如果出生日没有过立春那一刻,在命理公式中还是以2021年计算。只有过了立春才算2022年。

四柱之月柱:月干支计算方法:

月干支口诀

甲已之年丙作首,乙庚之岁戊为头,丙辛之岁寻庚起,

丁壬壬寅顺行流,更有戊癸何方觅,甲寅之上好追求。

这个是根据年干支计算月干支的方法,还是以1911年为辛亥年为例。1911年第一个月应该是天干应该是庚。月支当日还是以'寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥','子', '丑' 排序,第一个月地支为寅,所以1911年的第一个月应该是庚寅月。

年上起月干支表

private function computeMonth()
  {
    $start = null;
    $ymd = $this->solar->toYmd();
    $time = $this->solar->toYmdHms();
    $size = count(Lunar::$JIE_QI_IN_USE);
 //序号:大雪以前-3,大雪到小寒之间-2,小寒到立春之间-1,立春之后0
    $index = -3;
 for ($i = 0; $i < $size; $i += 2) {
      $end = $this->jieQi[Lunar::$JIE_QI_IN_USE[$i]];
      $symd = (null == $start) ? $ymd : $start->toYmd();
 if (strcmp($ymd, $symd) >= 0 && strcmp($ymd, $end->toYmd()) < 0) {
 break;
      }
      $start = $end;
      $index++;
    }
 //干偏移值(以立春当天起算)
    $offset = ((($this->yearGanIndexByLiChun + ($index < 0 ? 1 : 0)) % 5 + 1) * 2) % 10;
 $this->monthGanIndex = (($index < 0 ? $index + 10 : $index) + $offset) % 10;
 $this->monthZhiIndex = (($index < 0 ? $index + 12 : $index) + LunarUtil::$BASE_MONTH_ZHI_INDEX) % 12;
    $start = null;
    $index = -3;
 for ($i = 0; $i < $size; $i += 2) {
      $end = $this->jieQi[Lunar::$JIE_QI_IN_USE[$i]];
      $stime = null == $start ? $time : $start->toYmdHms();
 if (strcmp($time, $stime) >= 0 && strcmp($time, $end->toYmdHms()) < 0) {
 break;
      }
      $start = $end;
      $index++;
    }
 //干偏移值(以立春交接时刻起算)
    $offset = ((($this->yearGanIndexExact + ($index < 0 ? 1 : 0)) % 5 + 1) * 2) % 10;
 $this->monthGanIndexExact = (($index < 0 ? $index + 10 : $index) + $offset) % 10;
 $this->monthZhiIndexExact = (($index < 0 ? $index + 12 : $index) + LunarUtil::$BASE_MONTH_ZHI_INDEX) % 12;
  }

以上代码对立春进行了兼容,

$offset=((($this->yearGanIndexByLiChun+($index<0?1:0))%5+1)*2)%10;

这句话大家是否能懂,就是甲已,乙庚,丙辛都是合的关系,之间相差5,所以10天干,相差5年的天干是是一直的,所以模5。诗决中都是阳天干做首,丙,戊,庚,壬,甲,所以永远只有5个天干作为寅月的天干,所以要%2。

四柱之日柱:日干支计算方法:

具体计算公式如下[年的后三位乘5+年的后三位除4+9+阳历日子数+单月(为0)双月(30)+每个月的调节数]/60=取余数。余数就是花甲子的序数。余数的个位数为天干,余数除12取余为地支。

例一:1996年1月16日 (闰年)

(96×5+96÷4+9+16+1)÷60=8余50,50—1=49,49在六十甲子序数中是壬子。又:余数49的个位数9对应天干壬,49除12余1对应地支子,二数结合干支为“壬子”。

例二:1997年2月16日

(97×5+97÷4+9+16+30+2)÷60=9余26,26即为六十甲子序数。6对应天干己,26除12余2对应地支丑,对应干支为“己丑”。

例三:1998年3月16日

(98×5+98÷4+9+16)÷60=8余59,对应干支为“壬戌”。

例四:1999年4月16日

(99×5+99÷4+9+16+30+1)÷60=9余35,对应干支为“戊戌”。

例五:2000年7月16日

(100×5+100÷4+9+16+2)÷60=9余12,对应干支为“乙亥”。

四柱之时柱:时干支计算方法:

我国古代的时辰为两个小时为一个时辰,时柱是用干支来表示人出生的时辰,一个时辰在农历纪时中跨两个小时,一天共12个时辰。时柱的地支是固定不变的,即十二时辰所对应的地支。

夜半者子也,鸡鸣者丑也,平旦者寅也,日出者卯也,

食时者辰也,隅中者已也,日中者午也,日斜者未也,

哺时者申也,日入者酉也,黄昏者戌也,人定者亥也。

子时就是前日23点至当日1点,丑时即1点至3点,以此类推。亥时即21点至23点。

与月柱相同的是,时柱的地支不变,天干却有所不同,但亦有规律可循,我们可以用五鼠遁歌诀来推出时柱的天干。

甲己还加甲,乙庚丙作初。

丙辛从戊起,丁壬庚子居。

戊癸何方发,士子走真途。

这首歌诀是查时柱的歌决,意思是说,凡是日柱天干为甲、己的,子时天干便为甲,丑时天干为乙,其余以此类推。凡是日柱天干为乙、庚的,子时天干便为丙,丑时天干为丁,其余类推。凡是日柱天干为丙、辛的,子时天干便为戊,丑时天干为己,其余类推;凡是日柱天干为丁、壬的,子时天干便为庚,丑时天干为辛,其余类推,凡是日柱天干为戊、癸的,子时天千便为壬,丑时天干为癸,其余类推。

 private function computeTime()
  {
 $this->timeZhiIndex = LunarUtil::getTimeZhiIndex(($this->hour < 10 ? '0' : '') . $this->hour . ':' . ($this->minute < 10 ? '0' : '') . $this->minute);
 $this->timeGanIndex = ($this->dayGanIndexExact % 5 * 2 + $this->timeZhiIndex) % 10;
  }
 public static function getTimeZhiIndex($hm)
  {
    if (null == $hm) {
      return 0;
    }
    if (strlen($hm) > 5) {
      $hm = substr($hm, 0, 5);
    }
    $x = 1;
    for ($i = 1; $i < 22; $i += 2) {
      if (strcmp($hm, ($i < 10 ? '0' : '') . $i . ':00') >= 0 && strcmp($hm, ($i + 1 < 10 ? '0' : '') . ($i + 1) . ':59') <= 0) {
        return $x;
      }
      $x++;
    }
    return 0;
  }

时干支的计算方法和月干支类似,只是歌诀变成了五鼠遁歌诀,和月柱比较不用关心春节的异常场景,估计算方案简单多了,24个小时,没2个小时为一个时辰。时天干按下图对应就可。

杨广悟道第一课:年月日时天干地支的计算方法

五、测试:

杨广悟道-第一课:年月日时天干地支的计算方法算命先生网在线测算产品包含八字在线测算,婚姻在线测算,姓名在线测算,2021年运势测算,八字合婚测算,八字终生运等十几款优秀专业的产品服务,我们竭诚为有缘人提供我们力所能及的服务,祝您以及您的家人生活幸福、事业有成、安康体健。杨广悟道第一课:年月日时天干地支的计算方法http://www.tianyuce.com/test/lesson1/index.html

                       

点击阅读全文

上一篇 2023年 5月 25日 am10:55
下一篇 2023年 5月 25日 am10:57