一、背景说明:

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

为什么说是写一些易学之术呢,因为本人研究易学也有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

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

  1. 年月日时天干地支推算(农历、公历)

    八字分四柱,每柱2字,分别对应年.月.日.时 一.天干,地支 /*** 天干**/ public enum TianGan {甲(1, "甲"), 乙(2,"乙" ...

  2. SwiftUI 日期大全之日期日历年月日星期天干地支十二时辰时分秒(教程含源码)

    本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 使用Timer制作个clock 显示标准中文 显示农历天干地支十二时 解决方案 1.获取标准日期 //中文公历标准 //20 ...

  3. SwiftUI实战之日期日历年月日星期天干地支十二时辰时分秒

    本文价值与收获 看完本文后,您将能够作出下面的界面 Jietu20200409-210227@2x.jpg Jietu20200409-210626.gif 看完本文您将掌握的技能 使用Timer制作 ...

  4. 天干地支计算公式_求天干地支的计算方法,

    展开全部 天干:甲.乙.丙.丁.戊.己.庚.辛.壬.癸 地支:子e69da5e887aa62616964757a686964616f31333366303134.丑.寅.卯.辰.巳.午.未.申.酉.戌 ...

  5. C语言农历天干地支,求思路。农历年月日时推天干地支

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是百度知道提供的关于"天干地支"的详细介绍. 天干地支纪日 干支纪日,60日大致合2个月一个周期:一个周期完了重复使用,周而复始, ...

  6. java 天干地支_Java-获取年月日对应的天干地支

    1 public classMyDate {2 /** 3 * 对于年月日的天干地支4 */ 5 private intyear_ganZhi;6 private intmonth_ganZhi;7 ...

  7. Java-获取年月日对应的天干地支

    一.概述 本次是以java语言开发为例,计算出年月日对应的天干地支. 二.代码 1 public class MyDate { 2 /** 3 * 对于年月日的天干地支 4 */ 5 private ...

  8. 天干地支计算年月日时

    因过年前家里进伙(乔迁),让当地的先生选了时辰,通过对天干地支的了解,对古人的智慧尤为惊叹,因此,学习了一下.特此,记录所学内容. 天干地支,简称为干支,源自中国远古时代对天象的观测 天干:" ...

  9. java 从已知日期计算干支纪日_天干地支纪日纪时计算公式

    年:每个干支为一年,六十个干后,又从头算起,周而复始,循环不息.由甲子开始,满六十年称做一甲子或一花甲子.称为干支纪年法. 月:正月是由寅开始,每个月的地支固定不变,然后依次与天干组合:由第一年的正月 ...

最新文章

  1. Jmeter和LoadRunner的区别
  2. 一个妹子的美团面试经历,成功拿到 Offer
  3. 这才是数据挖掘领域常用的机器学习算法!
  4. ios序列化与反序列化,本地化
  5. instancing render
  6. typescript_清洁架构的TypeScript刺
  7. c#获取部分DRAW
  8. htt:// ************不在以下 request 合法域名列表中,请参考文档:******************************
  9. Java基础学习总结(79)——Java本地接口JNI详解
  10. STC8H8K系列汇编51实战——STC8H8K64U跑马灯(51版)
  11. Ext2.0的EditorGridPanel
  12. Android软件安全开发实践
  13. php在线拍照裁切,基于cropper.js封装vue实现在线图片裁剪组件的功能
  14. LUP分解的C++实现
  15. 利用朴素贝叶斯算法解决“公园凉鞋问题”
  16. Cacti auth.php,linux下cacti的搭建之详细过程!
  17. 无力回天...机关算尽,还是死在上线之中.............
  18. hautoj 1262 魔法宝石【最短路】
  19. x11制作显示窗口图片
  20. 本科计算机知识点,2018年电大本科计算机网考操作题题库重要知识点(6页)-原创力文档...

热门文章

  1. 根据证件号码(zjhm)自动显示出生日期,籍贯,户籍所在地等信息
  2. 菜刀工具连接不上_win7连接打印机提示错误0x00000002的解决教程
  3. 着色器(Shader)之顶点着色器
  4. 阿里海外市场久攻不下,蒋凡能不能打赢新战役?
  5. opboot怎么刷入固件_华硕RT-AC58U免拆机刷OpBoot教程-免变砖
  6. HTML5 (自学第四天)
  7. HTML的不同版本区别,HTML5与之前版本区别1
  8. 偌大的人才市场,如何完成入职背景调查?
  9. c语言编程循环结构加EOF语句练习
  10. “善于治”和“以善治”:华为云Stack在智慧城市的十年踪迹十年心