一、背景說明:
張三說過:世界上最遙遠的距離是什麼?不是馬裡亞納海溝和珠穆朗瑪峰的距離,而是知道和做到的距離,是的,一直以來都想寫一個系列的文章,介紹易學之術,但是怕寫的不好,邏輯不夠完美,技術不夠精湛,一直拖到現在還沒有動手。
為什麼說是寫一些易學之術呢,因為本人研究易學也有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