关于天干地支及其计算

       以天干地支计算日期是我国悠良的传统文化,最近在看如何计算人的生辰八字,写了个程序,但是只能算年的干支,月、日的干支计算方法太复杂了,望之只能却步,还是乖乖去查万年历比较好。这里记下关于干支的一些东西。

一、干支与岁星纪年的对应

       十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸(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时出生的人的八字就是:壬寅 癸卯 庚午 癸未。

       新时代的青年当求实上进,团结友爱,为实现中华民族的伟大复兴而努力~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值