
1、基本知识
中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑等,经过六十年又回到甲子。周而复始,循环不已。我国农历现仍沿用干支纪年。
本文中,我将计算公历某年某月某日某时的干支称为排四柱(该名称来源于传统的命理算卦)。
本文中将现行公历和格里高利历理解为同一种立法。
由于干支纪年法是以 60 年一轮回的周期,周而复始,循环不已。所以无法用某个单纯的公式计算,只能推算(仅本人看法),既然推算就必须有个起点,本文中已公历1583年1月1日为起点(儒略日1582年10月4日为格里高利日1582年10月15日)。通过查阅权威资料我们可知道,公历公历1583年1月1日的年、月、日干支为壬午年壬子月壬辰日。有了这个起点,再利用干支纪年的规律就好推算了。
2、日柱的计算
日柱, 即日期用干支来表示。日柱的计算比较简单,说它简单是因为日柱的计算比较独立。需要注意的是,日柱的交界点为凌晨12点(普遍这么认为),此时刚好为子时(23:00 - 1:00),故将 23:00 - 24:00 称为初子时,意为今夜之子时,非明日之早。将 24:00 - 1:00 称为正子时,意为明日之早。业界普遍将日柱分界点定位初子时,意思就是说初子时算今天,正子时算明天。(呵呵,绕口的)
首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。
然后,我这里给出一个我自己推导出的简单 c 语言公式:
// 天干
int nHeavenlyStems = (相隔天数 % 10 + 8) % 10 - 1;
// 地支
int nEarthlyBranches = (相隔天数 % 12 + 4) % 12 - 1;
接下来再简单修正一下:
if(hour >=23 || hour == 0)
{
// 已初子时为界(第二天的开始)
nHeavenlyStems++;
nEarthlyBranches++;
}
nHeavenlyStems = (nHeavenlyStems == -1) ? 9 : nHeavenlyStems;
结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
nEarthlyBranches = (nEarthlyBranches == -1) ? 11 : nEarthlyBranches;
结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
注意:日柱交界点是以初子时为界
3、时柱的计算
时柱, 即时辰用干支来表示。时柱的地支是确定的。古人将每 2 小时称为一个时辰,一天共 12 时辰,刚好对应 12 地支, 由凌晨1点开始每两小时对应于一地支,依次为:子丑寅...以下是对照表:
子丑寅卯辰己
23-01 01-03 03-05 05-07 07-09 09-11
午未申酉戊亥
11-13 13-1515-17 17-19 19-21 21-23
时柱的地支,这里我给出我自己推导出的简单 c 语言公式:
// 地支
int nEarthlyBranches = static_cast<int>(ceil(hour / 2.0));
nEarthlyBranches = (nEarthlyBranches == 12) ? 0 : nEarthlyBranches;
结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
时柱的天干是不固定的,但可根据下面日上起时标推算时柱的天干(就是说时柱的天干和日干有关)
日上起时表
时\日甲己 乙庚 丙辛 丁壬 戊癸
子甲子 丙子 戊子 庚子 壬子
丑乙丑 丁丑 己丑 辛丑 癸丑
寅丙寅 戊寅 庚寅 壬寅 甲寅
卯丁卯 己卯 辛卯 癸卯 乙卯
辰戊辰 庚辰 壬辰 甲辰 丙辰
巳己巳 辛巳 癸巳 乙巳 丁巳
午庚午 壬午 甲午 丙午 戊午
未辛未 癸未 乙未 丁未 己未
申壬申 甲申 丙申 戊申 庚申
酉癸酉 乙酉 丁酉 己酉 辛酉
戌甲戌 丙戌 戊戌 庚戌 壬戌
亥乙亥 丁亥 己亥 辛亥 癸亥
时柱的天干,这里我给出我自己根据上表推导出的简单 c 语言公式:
首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。
// 天干

int nHeavenlyStems = (相隔天数 % 10 + 8) % 10 - 1);
nHeavenlyStems = (nHeavenlyStems == -1) ? 9 : nHeavenlyStems;
nHeavenlyStems = ((nHeavenlyStems % 5) * 2 + nEarthlyBranches) % 10;
注意: 时柱地支是固定的,天干与日柱天干有关。
4、月柱的计算
月柱的起法,是以节气为交界,每交一节气(注意是节气而不是中气),则交替月柱,是即按太阳黄经之运行轨道,将一回归年分成十二分,用以标示四季寒暑之变化、五行盈亏之消息,命局十神之旺哀,在月令一字之分,故为四柱之提纲。自古代的中国,是一种利用天干和地支来准确记录年、月、日、时的方式,由“年干,年支”、“月干,月支”、“日干,日支”、“时干,时支”,共八个干支所组成(共八个字),年、月、日、时的干支组合称为“柱”,形成“年柱”、“月柱”、“日柱”、“时柱”,故八字又称为“四柱”或“四柱八字”。自古代的中国,是一种利用天干和地支来准确记录年、月、日、时的方式,由“年干,年支”、“月干,月支”、“日干,日支”、“时干,时支”,共八个干支所组成(共八个字),年、月、日、时的干支组合称为“柱”,形成“年柱”、“月柱”、“日柱”、“时柱”万年历生肖干支,故八字又称为“四柱”或“四柱八字”。
首先,根据 24 节气的规律推导出该月所对应的节气(令),这里我给出我自己推导出的简单 c 语言公式:
太阳黄经角度(节气) = month >= 4 ? 15 + (month - 4) * 30 : 270 + month * 15;
其次,计算该节气的具体发生时间(参:万年历计算 之 节气), 如果采用我的节气就算方法,那么计算出来的节气时间为格林尼治时间(UTC),还需进一步转变为本地时间(LST)。
再次,根据月柱的交界点条件,适当调整节气当地月份时间,公式如下:(monthLST,dayLST 为指定节气发生的本地时间)
monthLST = (monthLST > month) || ((monthLST == month && dayLST > day)) ? month - 1 : month;
最后,利用我自己推导出的简单 c 语言公式:
// 天干
int nHeavenlyStems = ((year - 1583) * 12 + monthLST + 12 - 4) % 10;
结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
// 地支
int nEarthlyBranches = ((year - 1583) * 12 + monthLST + 12) % 12;
结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
注意: monthLST,dayLST 为指定节气发生的本地时间
节气计算的结果为 UTC 时间,需要转换为 LST 时间
月柱的交界点为 24 节气中的节气(也就是令)
5、年柱的计算
年柱, 即人出生的年份用农历的干支表示. 注意上一年和下一年的分界线是以立春这一天的交节时刻划分的, 而不是以正月初一划分.如某人1998年正月初三生, 由于98年交立春是正月初八8时53分, 因此此人的年柱为97年之丁丑,而非98年之戊寅.。年柱, 即人出生的年份用农历的干支表示. 注意上一年和下一年的分界线是以立春这一天的交节时刻划分的, 而不是以正月初一划分. 如某人1998年正月初三生, 由于98年交立春是正月初八8时53分, 因此此人的年柱为97年之丁丑,而非98年之戊寅.。年柱,即人出生的年份用农历的干支表示. 注意上一年和下一年的分界线是以立春这一天的交节时刻划分的,而不是以正月初一划分.如某人1998年正月初三生,由于98年交立春是正月初八8时53分,因此此人的年柱为97年之丁丑,而非98年之戊寅。
故
首先,计算当年的立春时间(注意转换为本地时间)
月柱的起法,是以节气为交界,每交一节气(注意是节气而不是中气),则交替月柱,是即按太阳黄经之运行轨道,将一回归年分成十二分,用以标示四季寒暑之变化、五行盈亏之消息,命局十神之旺哀,在月令一字之分,故为四柱之提纲。第一种方法是:可以通过查《万年历》或《星座交界日查询表》中的二十四节气交节时间对照表,这样便可获知太阳每年进入十二星座的确切时间万年历生肖干支,即是先查出你出生的时间点处于哪两个最相邻近的24节气(中气)之间,接着对照上述的《太阳星座节气划分表》来确定自己属于哪一个太阳星座。第一种方法是:可以通过查《万年历》或《星座交界日查询表》中的二十四节气交节时间对照表,这样便可获知太阳每年进入十二星座的确切时间,首先查出你出生的时间点处于哪两个最相邻近的24节气(中气)之间,然后对照上述的《太阳星座节气划分表》来确定自己属于哪一个太阳星座。
yearLST = (st_month > month || ((st_month == month) && st_day > day)) ? yearLST - 1 : yearLST;
最后,我这里给出一个我自己推导出的简单 c 语言公式:
// 天干
int nHeavenlyStems = (yearLST - 1583 + 36 - 7) % 10;
结果为 0 - 9,依顺序分别代表 甲、乙、丙、丁、戊、己、庚、辛、壬、癸 十干
// 地支
int nEarthlyBranches = (yearLST - 1583 + 36 - 5) % 12;
结果为 0 - 11,依顺序分别代表 子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 十二支
注意:year 代表你要计算年干支的那一公历年。
年柱交界点为立春。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-106588-1.html
为什么后来检测用的小米送去的手机呢