使用Java计算生辰八字五行属性

五行八字基本要素

天干地支表

子鼠甲子丙子戊子庚子壬子
丑牛乙丑丁丑己丑辛丑癸丑
寅虎甲寅丙寅戊寅庚寅壬寅
卯兔乙卯丁卯己卯辛卯癸卯
辰龙甲辰丙辰戊辰庚辰壬辰
巳蛇乙巳丁巳己巳辛巳癸巳
午马甲午丙午戊午庚午壬午
未羊乙未丁未己未辛未癸未
申猴甲申丙申戊申庚申壬申
酉鸡乙酉丁酉己酉辛酉癸酉
戌狗甲戌丙戌戊戌庚戌壬戌
亥猪乙亥丁亥己亥辛亥癸亥
说明: 天干地支简称干支,干支纪年是我国传统的纪年方法即为天干地支纪年法
  • 十天干分别为:甲乙 丙丁 戊己 庚辛 壬癸
  • 十二地支分别为:子丑 寅卯 辰巳 午未 申酉 戌亥
  • 干和支组合后用于纪年,将十天干和十二地支按顺序搭配组合成干支,用于纪年。按此排法,当天干 10 个符号排了六轮与地支 12 个符号排了五轮以后,可构成 60 干支。续排下去又将恢复原状,周而复始,即:“六十年为一个甲子”

天干地支对应编号

  • 甲子 00,乙丑 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

计算公元后某年的干支

假设公元后某年为 X 则先用 X 除以 60 得出余数再减去 4,根据所得结果查表中对应的编号即可算出该年的干支

比如:2020 除以 60 余 40 减去 4 等于 36,对应干支为 庚子年,当 X 除以 60 的余数小于 4 时,需借干支纪年的一个周期 60 再减 4,例如 1983 除以 60 余数为 3,直接减 4 不够减,加上 60 之后再减 4 等于 59,1983 年为 癸亥年

干支纪月法

若遇甲或己的年份 ,正月是丙寅;遇上乙或庚之年,正月为戊寅;遇上丙或辛之年,正月为庚寅;遇上丁或壬之年,正月为壬寅;遇上戊或癸之年,正月为甲寅。依照正月之干支,其余月份按干支推算即可
年份正月二月三月四月五月六月七月八月九月十月冬月腊月
甲、己丙寅丁卯戊辰己巳庚午辛未壬申癸酉甲戌乙亥丙子丁丑
乙、庚戊寅己卯庚辰辛巳壬午癸未甲申乙酉丙戌丁亥戊子己丑
丙、辛庚寅辛卯壬辰癸巳甲午乙未丙申丁酉戊戌己亥庚子辛丑
丁、壬壬寅癸卯甲辰乙巳丙午丁未戊申己酉庚戌辛亥壬子癸丑
戊、癸甲寅乙卯丙辰丁巳戊午己未庚申辛酉壬戌癸亥甲子乙丑

干支纪日法

从已知日期计算干支纪日的公式为:

  • 天干 = (4 * C + [C / 4] + 5 * y + [y / 4] + [3 * (M + 1) / 5] + d - 3) % 10

  • 地支 = (8 * C + [C / 4] + 5 * y + [y / 4] + [3 * (M + 1) / 5] + d + 7 + i) % 12

      	注意: [] 里的除法取整即可
    

说明如下:

  • c 为年份前两位,比如 2019 年则 c 为 20
  • y 为年份后两位,比如 2019 年则 y 为 19
  • M 为月份,1 月和 2 月按上一年的 13 月和 14 月来算
  • d 为日数
  • i
    • 奇数月为 0
    • 偶数月为 6

比如计算 2020 年 2 月 9 日的干支日如下:

  • 天干 = (4 * 20 + 20 / 4 + 5 * 19 + 19 / 4 + 3 * (14 + 1) / 5 + 9 - 3) % 10 = 9 即 壬
  • 地支 = (8 * 20 + 20 / 4 + 5 * 19 + 19 / 4 + 3 * (14 + 1) / 5 + 9 + 7 + 6) % 12 = 7 即 午

十二时辰表

时辰时间
子时23 - 01
丑时01 - 03
寅时03 - 05
卯时05 - 07
辰时07 - 09
巳时09 - 11
午时11 - 13
未时13 - 15
申时15 - 17
酉时17 - 19
戌时19 - 21
亥时21 - 23
注意: 根据上表可以得出生辰八字的第八个字,比如早上 9 点出生即第八个字为 巳

十二时辰纪日对照表

想要得到第七个字,需要使用以下对照表;比如 2020 年(庚子) 2 月(戊寅) 9 日(壬午)晚上 23 点(子时),找到 对应的字即下表中的 庚子

时/日甲、己乙、庚丙、辛丁、壬戊、癸
甲、子丙 、子戊、子庚、子壬、子
乙、丑丁、丑己、丑辛、丑癸、丑
丙、寅戊、寅庚、寅壬、寅甲、寅
丁、卯己、卯辛、卯癸、卯乙、卯
戊、辰庚、辰壬、辰甲、辰丙、辰
己、巳辛、巳癸、巳乙、巳丁、巳
庚、午壬、午甲、午丙、午戊、午
辛、未癸、未乙、未丁、未己、未
壬、申甲、申丙、申戊、申庚、申
癸、酉乙、酉丁、酉己、酉辛、酉
甲、戌丙、戌戊、戌庚、戌壬、戌
乙、亥丁、亥己、亥辛、亥癸、亥

生辰八字 = 年(庚子) + 月(戊寅) + 日(壬午) + 时(庚子)

五行干支对照表

五行天干地支
甲、乙寅、卯
丙、丁巳、午
戊、己辰、丑、戌、未
庚、辛申、酉
壬、癸亥、子

按照上面的生辰八字得出五行(2 个金,3 个水,1 个土,1 个木,1 个火;此子五行不缺)

庚子戊寅壬午庚子
金水土木水火金水

五行八字Java实现代码

package com.luxiu.java.base.wuxing;

/**
 * <p>
 * Description: 测试八字与五行版本1
 * </p>
 *
 * @author luguangdong
 * @version 1.0
 * @ClassName WuXingApp
 * @date 2020/3/20 9:51
 * @company 
 */
public class WuXingApp {
    private static final String[] TG = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
    private static final String[] DZ = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};

    public static void main(String[] args) {
        // 公元后某年
        int year = 2020;
        // 农历某月
        int nMonth = 1;
        // 阳历某月
        int yMonth = 2;
        // 阳历某日
        int day = 10;
        // 时间
        int time = 15;

        // 获取干支年
        String gzYear = getYear(year);
        System.out.println(year + " 年为 \"" + gzYear + "\" 年");

        // 获取干支月
        String gzMonth = getMonth(gzYear, nMonth);
        System.out.println(year + " 年农历 " + nMonth + " 月为 \"" + gzMonth + "\" 月");

        // 获取干支日
        String gzDay = getDay(year, yMonth, day);
        System.out.println(year + " 年阳历 " + yMonth + " 月 " + day + " 日为 \"" + gzDay + "\" 日");

        // 获取干支时
        String gzTime = getTime(gzDay, time);
        System.out.println(year + " 年阳历 " + yMonth + " 月 " + day + " 日 " + time + " 时为 \"" + gzTime + "\" 时");

        // 生辰八字
        System.out.println("您的生辰八字为:" + gzYear + gzMonth + gzDay + gzTime);

        // 生辰八字算五行
        wuxing(gzYear, gzMonth, gzDay, gzTime);
    }

    /**
     * 获取干支年 <br />
     * 根据公元后某年换算出干支年 <br />
     *
     * <p>
     * 说明:假设公元后某年为 X 则先用 X 除以 60 得出余数再减去 4,根据所得结果查表中对应的编号即可算出该年的干支 <br />
     * 如果减 4 不够减则加上 60 之后再减即可
     * </p>
     *
     * @param year {@code int} 公元后的某一年
     * @return {@code String} 干支年
     */
    public static String getYear(int year) {
        // 假设公元后某年为 X 则先用 X 除以 60 得出余数
        int gzNum = year % 60;

        // 用余数减 4 不够减则加上 60 之后再减得出编号
        if (gzNum - 4 < 0) {
            gzNum = gzNum + 60 - 4;
        } else {
            gzNum = gzNum - 4;
        }

        // 遍历天干地支
        for (int i = 0; i < 60; i++) {
            int itg = i % TG.length; // 取余数防止数组越界
            int idz = i % DZ.length; // 同上
            if (gzNum == i) {
                // 根据天干地支的索引进行匹配
                return TG[itg] + DZ[idz];
            }
        }

        return null;
    }

    /**
     * 获取干支月 <br />
     * 根据干支年换算出干支月 <br />
     *
     * <p>
     * 说明:若遇甲或己的年份 ,正月是丙寅;遇上乙或庚之年,正月为戊寅;遇上丙或辛之年,正月为庚寅;遇上丁或壬之年,正月为壬寅;遇上戊或癸之年,正月为甲寅
     * </p>
     *
     * @param gzYear {@code String} 干支年
     * @param month  {@code int} 农历的月份
     * @return {@code String} 干支月
     */
    public static String getMonth(String gzYear, int month) {
        String stg = gzYear.substring(0, 1);

        int itgFlag = 0;
        // 如果干支年的天干位为 “甲” 或 “己”,则从 TG 数组下标的第 2 位开始
        if ("甲".equals(stg) || "己".equals(stg)) {
            itgFlag = 2;
        } else if ("乙".equals(stg) || "庚".equals(stg)) {
            itgFlag = 4;
        } else if ("丙".equals(stg) || "辛".equals(stg)) {
            itgFlag = 6;
        } else if ("丁".equals(stg) || "壬".equals(stg)) {
            itgFlag = 8;
        }

        for (int i = 0; i < 12; i++) {
            int itg = (i + itgFlag) % TG.length;
            int idz = (i + 2) % DZ.length;

            if (i == month - 1) {
                return TG[itg] + DZ[idz];
            }
        }

        return null;
    }

    /**
     * 获取干支日 <br />
     * 根据阳历年月日换算出干支日 <br />
     * 天干 = (4 * c + c / 4 + 5 * y + y / 4 + 3 * (m + 1) / 5 + d - 3) % 10 <br />
     * 地支 = (8 * c + c / 4 + 5 * y + y / 4 + 3 * (m + 1) / 5 + d + 7 + i) % 12 <br />
     *
     * <ul>
     *     <li>c 为年份前两位,比如 2019 年则 c 为 20</li>
     *     <li>y 为年份后两位,比如 2019 年则 y 为 19</li>
     *     <li>m 为月份,1 月和 2 月按上一年的 13 月和 14 月来算</li>
     *     <li>d 为日数</li>
     *     <li>奇数月 i 为 0</li>
     *     <li>偶数月 i 为 6</li>
     * </ul>
     *
     * @param year  {@code int} 阳历年
     * @param month {@code int} 阳历月
     * @param day   {@code int} 阳历日
     * @return {@code String} 干支日
     */
    public static String getDay(int year, int month, int day) {
        String yearStr = String.valueOf(year);
        int c = Integer.parseInt(yearStr.substring(0, 2));
        int y = Integer.parseInt(yearStr.substring(2));
        // 嵌套的三元表达式,1 月和 2 月按上一年的 13 月和 14 月来算
        int m = month == 1 ? 13 : month == 2 ? 14 : month;
        if (m == 13 || m == 14) {
            y--;
        }
        int d = day;
        // 三元表达式,月份除以 2 余 0 则为偶数否则为奇数
        int i = m % 2 != 0 ? 0 : 6;

        int itg = (4 * c + c / 4 + 5 * y + y / 4 + 3 * m / 5 + d - 3) % 10;
        int idz = (8 * c + c / 4 + 5 * y + y / 4 + 3 * m / 5 + d + 7 + i) % 12;

        return TG[itg] + DZ[idz];
    }

    /**
     * 获取干支时 <br />
     *
     * <p>
     * 说明:根据十二时辰只能得出支,想要得到干,需要配合干支日换算
     * </p>
     *
     * @param gzDay {@code String} 干支日
     * @param time  {@code int} 24 小时制的时间
     * @return {@code String} 干支时
     */
    public static String getTime(String gzDay, int time) {
        // 取出干支日的第一个字
        gzDay = gzDay.substring(0, 1);

        // 换算出时间对应地支的下标位置
        int idz = 0;
        if (time >= 23 || time < 1) {
            idz = 0;
        } else if (time >= 1 && time < 3) {
            idz = 1;
        } else if (time >= 3 && time < 5) {
            idz = 2;
        } else if (time >= 5 && time < 7) {
            idz = 3;
        } else if (time >= 7 && time < 9) {
            idz = 4;
        } else if (time >= 9 && time < 11) {
            idz = 5;
        } else if (time >= 11 && time < 13) {
            idz = 6;
        } else if (time >= 13 && time < 15) {
            idz = 7;
        } else if (time >= 15 && time < 17) {
            idz = 8;
        } else if (time >= 17 && time < 19) {
            idz = 9;
        } else if (time >= 19 && time < 21) {
            idz = 10;
        } else if (time >= 21 && time < 23) {
            idz = 11;
        }

        int itgFlag = 8;
        // 如果干支年的天干位为 “甲” 或 “己”,则从 TG 数组下标的第 0 位开始
        if ("甲".equals(gzDay) || "己".equals(gzDay)) {
            itgFlag = 0;
        } else if ("乙".equals(gzDay) || "庚".equals(gzDay)) {
            itgFlag = 2;
        } else if ("丙".equals(gzDay) || "辛".equals(gzDay)) {
            itgFlag = 4;
        } else if ("丁".equals(gzDay) || "壬".equals(gzDay)) {
            itgFlag = 6;
        }

        return TG[(idz + itgFlag) % 10] + DZ[idz];
    }

    /**
     * 通过八字算五行
     *
     * @param gzYear  {@code String} 干支年
     * @param gzMonth {@code String} 干支月
     * @param gzDay   {@code String} 干支日
     * @param gzTime  {@code String} 干支时
     */
    public static void wuxing(String gzYear, String gzMonth, String gzDay, String gzTime) {
        // 天干年
        String gYear = gzYear.substring(0, 1);
        if ("甲".equals(gYear) || "乙".equals(gYear)) {
            gYear = "木";
        }
        if ("丙".equals(gYear) || "丁".equals(gYear)) {
            gYear = "火";
        }
        if ("戊".equals(gYear) || "己".equals(gYear)) {
            gYear = "土";
        }
        if ("庚".equals(gYear) || "辛".equals(gYear)) {
            gYear = "金";
        }
        if ("壬".equals(gYear) || "癸".equals(gYear)) {
            gYear = "水";
        }

        // 天干月
        String gMonth = gzMonth.substring(0, 1);
        if ("甲".equals(gMonth) || "乙".equals(gMonth)) {
            gMonth = "木";
        }
        if ("丙".equals(gMonth) || "丁".equals(gMonth)) {
            gMonth = "火";
        }
        if ("戊".equals(gMonth) || "己".equals(gMonth)) {
            gMonth = "土";
        }
        if ("庚".equals(gMonth) || "辛".equals(gMonth)) {
            gMonth = "金";
        }
        if ("壬".equals(gMonth) || "癸".equals(gMonth)) {
            gMonth = "水";
        }

        // 天干日
        String gDay = gzDay.substring(0, 1);
        if ("甲".equals(gDay) || "乙".equals(gDay)) {
            gDay = "木";
        }
        if ("丙".equals(gDay) || "丁".equals(gDay)) {
            gDay = "火";
        }
        if ("戊".equals(gDay) || "己".equals(gDay)) {
            gDay = "土";
        }
        if ("庚".equals(gDay) || "辛".equals(gDay)) {
            gDay = "金";
        }
        if ("壬".equals(gDay) || "癸".equals(gDay)) {
            gDay = "水";
        }

        // 天干时
        String gTime = gzTime.substring(0, 1);
        if ("甲".equals(gTime) || "乙".equals(gTime)) {
            gTime = "木";
        }
        if ("丙".equals(gTime) || "丁".equals(gTime)) {
            gTime = "火";
        }
        if ("戊".equals(gTime) || "己".equals(gTime)) {
            gTime = "土";
        }
        if ("庚".equals(gTime) || "辛".equals(gTime)) {
            gTime = "金";
        }
        if ("壬".equals(gTime) || "癸".equals(gTime)) {
            gTime = "水";
        }

        // 地支年
        String zYear = gzYear.substring(1);
        if ("寅".equals(zYear) || "卯".equals(zYear)) {
            zYear = "木";
        }
        if ("巳".equals(zYear) || "午".equals(zYear)) {
            zYear = "火";
        }
        if ("辰".equals(zYear) || "丑".equals(zYear) || "戌".equals(zYear) || "未".equals(zYear)) {
            zYear = "土";
        }
        if ("申".equals(zYear) || "酉".equals(zYear)) {
            zYear = "金";
        }
        if ("亥".equals(zYear) || "子".equals(zYear)) {
            zYear = "水";
        }

        // 地支月
        String zMonth = gzMonth.substring(1);
        if ("寅".equals(zMonth) || "卯".equals(zMonth)) {
            zMonth = "木";
        }
        if ("巳".equals(zMonth) || "午".equals(zMonth)) {
            zMonth = "火";
        }
        if ("辰".equals(zMonth) || "丑".equals(zMonth) || "戌".equals(zMonth) || "未".equals(zMonth)) {
            zMonth = "土";
        }
        if ("申".equals(zMonth) || "酉".equals(zMonth)) {
            zMonth = "金";
        }
        if ("亥".equals(zMonth) || "子".equals(zMonth)) {
            zMonth = "水";
        }

        // 地支日
        String zDay = gzDay.substring(1);
        if ("寅".equals(zDay) || "卯".equals(zDay)) {
            zDay = "木";
        }
        if ("巳".equals(zDay) || "午".equals(zDay)) {
            zDay = "火";
        }
        if ("辰".equals(zDay) || "丑".equals(zDay) || "戌".equals(zDay) || "未".equals(zDay)) {
            zDay = "土";
        }
        if ("申".equals(zDay) || "酉".equals(zDay)) {
            zDay = "金";
        }
        if ("亥".equals(zDay) || "子".equals(zDay)) {
            zDay = "水";
        }

        // 地支时
        String zTime = gzTime.substring(1);
        if ("寅".equals(zTime) || "卯".equals(zTime)) {
            zTime = "木";
        }
        if ("巳".equals(zTime) || "午".equals(zTime)) {
            zTime = "火";
        }
        if ("辰".equals(zTime) || "丑".equals(zTime) || "戌".equals(zTime) || "未".equals(zTime)) {
            zTime = "土";
        }
        if ("申".equals(zTime) || "酉".equals(zTime)) {
            zTime = "金";
        }
        if ("亥".equals(zTime) || "子".equals(zTime)) {
            zTime = "水";
        }

        // 输出五行
        String wuxing = gYear + zYear + gMonth + zMonth + gDay + zDay + gTime + zTime;
        System.out.println("您的八字五行为:" + wuxing);

        // 算出五行缺啥
        String que = "您的五行缺:";
        if (!wuxing.contains("金")) {
            que += "金";
        }
        if (!wuxing.contains("木")) {
            que += "木";
        }
        if (!wuxing.contains("水")) {
            que += "水";
        }
        if (!wuxing.contains("火")) {
            que += "火";
        }
        if (!wuxing.contains("土")) {
            que += "土";
        }
        System.out.println(que.equals("您的五行缺:") ? "恭喜,您的五行不缺" : que);
    }
}

源码地址:https://github.com/luguangdong/java-base/blob/master/src/com/luxiu/java/base/wuxing/WuXingApp2.java

好的,以下是用 Java 编写的一个简单的生辰八字计算算法: ```java public class EightCharacterCalculator { public static String calculateEightCharacter(int year, int month, int day, int hour) { String[] tiangan = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}; String[] dizhi = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}; String[] wuxing = {"水", "土", "木", "木", "土", "火", "火", "土", "金", "金", "土", "水"}; int[] shuxiang = {2, 1, 2, 2, 1, 1, 0, 1, 0, 0, 1, 0}; int[] shichen = {23, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21}; int y = year - 4; int zhiIndex = (y % 60) % 12; String tianganStr = tiangan[(y % 60) % 10]; String dizhiStr = dizhi[zhiIndex]; String wuxingStr = wuxing[zhiIndex % 5]; int shuxiangIndex = (zhiIndex + 1) % 12; int shuxiangValue = shuxiang[shuxiangIndex]; int shichenIndex = hour / 2; int shichenValue = shichen[shichenIndex % 12]; String result = tianganStr + dizhiStr + "年 " + wuxingStr + " " + shuxiangValue + " " + shichenValue; return result; } } ``` 这个方法接受四个参数:年、月、日、时,返回一个字符串,表示该生辰的八字。在方法中,我们首先建立了一个 tiangan 数组和一个 dizhi 数组,分别表示天干和地支。然后我们计算出该年的天干和地支的索引,以及天干和地支的字符串值,并且计算出地支的五行属性。接着,我们根据地支的索引计算出该地支的属性值,以及根据出生时间计算出该时辰的属性值。最后,我们将这些信息整合成一个字符串,返回给调用者。需要注意的是,这个算法只是一个简单的实现,对于更加复杂的生辰八字计算算法,还需要考虑更多的因素。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值