以天干地支计算日期是我国悠良的传统文化,最近在看如何计算人的生辰八字,写了个程序,但是只能算年的干支,月、日的干支计算方法太复杂了,望之只能却步,还是乖乖去查万年历比较好。这里记下关于干支的一些东西。
一、干支与岁星纪年的对应
十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸(guǐ)。
十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
岁星纪年干支表示:
岁星纪年十干曰:阏逢(yān féng)、旃蒙(zhān méng)、柔兆(róu zhào)、强圉(qiáng yǔ)、著雍(zhù yōng)、屠维(tú wéi)、上章(shàng zhāng)、重光(chóng guāng)、玄黓(xuán yì)、昭阳。
岁星纪年十二支曰:困敦(kùn dūn)、赤奋若(chì fèn ruò)、摄提格(shè tí gé)、单阏(chán yān)、执徐(zhí xú)、大荒落(dà huāng luò)、敦牂(dūn zāng)、协洽(xié qià)、涒滩(tūn tān)、作噩(zuò è)、阉茂(yān mào)、大渊献。
六十花甲子、生肖、时辰:
子鼠 | 丑牛 | 寅虎 | 卯兔 | 辰龙 | 巳蛇 | 午马 | 未羊 | 申猴 | 酉鸡 | 戌狗 | 亥猪 |
---|---|---|---|---|---|---|---|---|---|---|---|
子时 (23-1) | 丑时 (1-3) | 寅时 (3-5) | 卯时 (5-7) | 辰时 (7-9) | 巳时 (9-11) | 午时 (11-13) | 未时 (13-15) | 申时 (15-17) | 酉时 (17-19) | 戌时 (19-21) | 亥时 (21-23) |
01.甲子 | 02.乙丑 | 03.丙寅 | 04.丁卯 | 05.戊辰 | 06.己巳 | 07.庚午 | 08.辛未 | 09.壬申 | 10.癸酉 | ||
11.甲戌 | 12.乙亥 | 13.丙子 | 14.丁丑 | 15.戊寅 | 16.己卯 | 17.庚辰 | 18.辛巳 | 19.壬午 | 20.癸未 | ||
21.甲申 | 22.乙酉 | 23.丙戌 | 24.丁亥 | 25.戊子 | 26.己丑 | 27.庚寅 | 28.辛卯 | 29.壬辰 | 30.癸巳 | ||
31.甲午 | 32.乙未 | 33.丙申 | 34.丁酉 | 35.戊戌 | 36.己亥 | 37.庚子 | 38.辛丑 | 39.壬寅 | 40.癸卯 | ||
41.甲辰 | 42.乙巳 | 43.丙午 | 44.丁未 | 45.戊申 | 46.己酉 | 47.庚戌 | 48.辛亥 | 49.壬子 | 50.癸丑 | ||
51.甲寅 | 52.乙卯 | 53.丙辰 | 54.丁巳 | 55.戊午 | 56.己未 | 57.庚申 | 58.辛酉 | 59.壬戌 | 60.癸亥 |
二、干支纪年程序
目前只能纪年,月、日、时待补充,预计猴年马月补充完(狗头)~
eightword.h
#ifndef __EIGHTWORD__
#define __EIGHTWORD__
#include<stdio.h>
#define CENTURY_20 4.6295
#define CENTURY_21 3.87
#define CENTURY_22 4.15
char tianGan[10][3] = { "甲", "乙", "丙", "丁", "戊", \
"己", "庚", "辛", "壬", "癸" };
char diZhi[12][3] = { "子", "丑", "寅", "卯", "辰", "巳", "午", \
"未", "申", "酉", "戌", "亥" };
void PrintYiJiaZi()
{
int jiaZi = 60;
int tianGanNum = 0, diZhiNum = 0;
printf("天干:");
for (int i = 0; i < 10; i++) {
printf("%c%c%c ", tianGan[i][0], tianGan[i][1], tianGan[i][2]);
}
printf("\n地支:");
for (int j = 0; j < 12; j++) {
printf("%c%c%c ", diZhi[j][0], diZhi[j][1], diZhi[j][2]);
}
printf("\n\n");
printf("六十花甲子:\n");
while ( jiaZi > 0) {
if (tianGanNum == 10) {
tianGanNum = 0;
}
if (diZhiNum == 12) {
diZhiNum = 0;
printf("\n");
}
printf("%c%c%c%c%c%c ", tianGan[tianGanNum][0], tianGan[tianGanNum][1],
tianGan[tianGanNum][2],diZhi[diZhiNum][0],
diZhi[diZhiNum][1], diZhi[diZhiNum][2]);
tianGanNum++;
diZhiNum++;
jiaZi--;
}
printf("\n");
}
void YearGanZhi(int year, char y_GanZhi[2][3], int gan)
{
printf("请输入年份(如:1944):\n");
printf("tips:公元1年为辛酉年,纪月依据夏历,正月建寅~~\n");
scanf("%d",&year);
gan = (year + 6) % 10;
int zhi = (year + 8) % 12;
for (int i= 0; i < 3; i++) {
y_GanZhi[0][i] = tianGan[gan][i];
}
for (int j= 0; j < 3; j++) {
y_GanZhi[1][j] = diZhi[zhi][j];
}
printf("%c%c%c%c%c%c\n", y_GanZhi[0][0], y_GanZhi[0][1], y_GanZhi[0][2]
, y_GanZhi[1][0], y_GanZhi[1][1], y_GanZhi[1][2]);
}
void MonthGanZhi(int month, int year, char m_GanZhi[2][3], int gan)
{
printf("根据下面的口诀及年天干推断月柱\n");
printf("甲己之年丙作首,\n");
printf("乙庚之岁戊为头,\n");
printf("丙辛必定寻庚起,\n");
printf("丁壬壬位顺行流,\n");
printf("更有戊癸何方觅,\n");
printf("甲寅之上好追求.\n\n");
int liChun = (year % 100 * 0.2422 + CENTURY_21) - ((year % 100 - 1) / 4);
}
void DayGanZhi(int gan)
{
printf("根据下面的口诀及日天干推断时柱\n");
printf("甲己还生甲,\n");
printf("乙庚丙作初,\n");
printf("丙辛从戊起,\n");
printf("丁壬庚子居,\n");
printf("戊癸何方始,\n");
printf("壬子是真途.\n\n");
}
#endif
eightword.c
#include "eightword.h"
int main(int argc, char* argv[])
{
int year, month;
int gan = 0;
char y_GanZhi[2][3] = {"0"};
char m_GanZhi[2][3] = {"0"};
char d_GanZhi[2][3] = {"0"};
char h_GanZhi[2][3] = {"0"};
PrintYiJiaZi();
YearGanZhi(year, y_GanZhi, gan);
MonthGanZhi(month, year, m_GanZhi, gan);
DayGanZhi(gan);
printf("\n");
return 0;
}
这里顺便打印了干支及一个甲子,干支纪月和干支纪时可以根据后面的两个口诀,很容易理解,比写代码容易理解多了。
三、干支纪月
干支纪月可以根据口诀:
甲己之年丙作首,
乙庚之岁戊为头,
丙辛必定寻庚起,
丁壬壬位顺行流,
更有戊癸何方觅,
甲寅之上好追求.
来自己推算。
当知道了年份的天干,就可以根据口诀推算出月份的天干,而月份的地支根据夏历,正月建寅,即正月就是寅月,二月就是卯月,以此类推。
例如2022年的农历七月,2022年是壬寅年,根据“丁壬壬位顺行流”可知2022年的正月的天干是壬,而农历七月是申月,所以2022年七月的干支大概就是戊申。
为什么要说大概呢?
因为干支纪月的寅月是从春分这天开始计算的,而且每个月也都是根据二十四节来区分的。
根据口诀及二十字节有:
农历 | 地支 | 节气 | 中气 | 近似公历 | 甲或己年 | 乙或庚年 | 丙或辛年 | 丁或壬年 | 戊或癸年 |
---|---|---|---|---|---|---|---|---|---|
正月 | 寅月 | 立春-惊蛰 | 雨水 | 2月 | 丙寅月 | 戊寅月 | 庚寅月 | 壬寅月 | 甲寅月 |
二月 | 卯月 | 惊蛰-清明 | 春分 | 3月 | 丁卯月 | 己卯月 | 辛卯月 | 癸卯月 | 乙卯月 |
三月 | 辰月 | 清明-立夏 | 谷雨 | 4月 | 戊辰月 | 庚辰月 | 壬辰月 | 甲辰月 | 丙辰月 |
四月 | 巳月 | 立夏-芒种 | 小满 | 5月 | 己巳月 | 辛巳月 | 癸巳月 | 乙巳月 | 丁巳月 |
五月 | 午月 | 芒种-小暑 | 夏至 | 6月 | 庚午月 | 壬午月 | 甲午月 | 丙午月 | 戊午月 |
六月 | 未月 | 小暑-立秋 | 大暑 | 7月 | 辛未月 | 癸未月 | 乙未月 | 丁未月 | 己未月 |
七月 | 申月 | 立秋-白露 | 处暑 | 8月 | 壬申月 | 甲申月 | 丙申月 | 戊申月 | 庚申月 |
八月 | 酉月 | 白露-寒露 | 秋分 | 9月 | 癸酉月 | 乙酉月 | 丁酉月 | 己酉月 | 辛酉月 |
九月 | 戌月 | 寒露-立冬 | 霜降 | 10月 | 甲戌月 | 丙戌月 | 戊戌月 | 庚戌月 | 壬戌月 |
十月 | 亥月 | 立冬-大雪 | 小雪 | 11月 | 乙亥月 | 丁亥月 | 己亥月 | 辛亥月 | 癸亥月 |
十一月 | 子月 | 大雪-小寒 | 冬至 | 12月 | 丙子月 | 戊子月 | 庚子月 | 壬子月 | 甲子月 |
十二月 | 丑月 | 小寒-立春 | 大寒 | 1月 | 丁丑月 | 己丑月 | 辛丑月 | 癸丑月 | 乙丑月 |
所以我到了干支纪月的这一步直接撞了南墙了,干支纪日更不用说了,还是查万年历,嘿嘿,万年历真好,嘿嘿。
四、干支计时
干支纪时可根据日的干支及口诀:
甲己还生甲,
乙庚丙作初,
丙辛从戊起,
丁壬庚子居,
戊癸何方始,
壬子是真途.
来计算。
如2022年3月18日14时,年月日直接查万年历:
2022年3月18日
星期五农历二月十六
壬寅年(虎年) 癸卯月 庚午日
宜:解除 扫舍 馀事勿取
忌:诸事不宜
日的天干为庚,根据“乙庚丙作初”可知这一天的子时是丙子时,而14时的地支是未,也就是未时,天干则是癸,即14时是癸未时。所以这一天(2022年3月18日 )14时出生的人的八字就是:壬寅 癸卯 庚午 癸未。
新时代的青年当求实上进,团结友爱,为实现中华民族的伟大复兴而努力~