赛博算命之八字测算事业运势的Java实现(四柱、五行、十神、流年、格局详细测算)
个人主页-爱因斯晨
文章专栏-赛博算命
最近学习人工智能时遇到一个好用的网站分享给大家:
人工智能学习
文末有投票,评论区有红包哦!
前言
在前段时间更新了赛博算命系列,出乎我的意料反响很好。也受到广大网友的赞赏,今天将继续更新赛博算命系列——使用八字来算事业运。我在前几篇文章中更新过关于八字排盘的,其实内容很片面只是算了四柱。在博大精深的算命文化中,这不够严谨。分析一个事情要全方位考虑,也就比较复杂。比如算事业运,可以根据八字也可以根据六爻。根据八字但不能只根据八字,要算四柱,五行,十神,流年和格局。总的来说是很复杂很麻烦,写这篇博客也花了会很大的心力。由衷感叹古人的智慧博大精深!
一、四柱
1.1 初识
四柱由 “年柱、月柱、日柱、时柱” 组成,每组干支分别对应出生的时间维度,各有其象征意义:
- 年柱(出生年份的干支)
- 代表祖上、家庭根基、早年运势(1-16 岁)。
- 年干:象征祖父、外部环境的初始影响;
- 年支:象征祖母、家庭整体氛围。
- 例:1990 年为庚午年,年柱即为 “庚午”(庚为阳金,午为阳火)。
- 月柱(出生月份的干支)
- 代表父母、兄弟姐妹、青年运势(17-32 岁),是四柱中最重要的一柱(称为 “提纲”)。
- 月干:象征父亲、事业初期的助力;
- 月支(月令):决定八字的 “格局”,是五行力量的主要来源,影响整体命局的平衡。
- 例:农历五月为午月,若 1990 年五月的月干为壬午,则月柱为 “壬午”。
- 日柱(出生日期的干支)
- 代表自身(日主)、配偶、中年运势(33-48 岁),是四柱的核心。
- 日干(日主):自身的象征,是分析十神、五行强弱的基准;
- 日支:象征配偶、婚姻关系、内心状态。
- 例:农历五月初五为甲申日,日柱即为 “甲申”(甲为阳木,代表日主自身;申为阳金,代表配偶宫)。
- 时柱(出生时辰的干支)
- 代表子女、晚年运势(49 岁以后)、最终成就。
- 时干:象征儿子、事业的延续性;
- 时支:象征女儿、晚年生活状态。
- 例:午时出生,若时干为庚,则时柱为 “庚午”。
1.2 原理
- 年柱:以农历新年为分界(而非公历 1 月 1 日),如 2024 年农历正月初一后为甲辰年,之前为癸卯年。
- 月柱:以节气为分界(如立春后为寅月,惊蛰后为卯月),而非农历月份数字,需用 “五虎遁” 口诀推算月干。
- 日柱:需根据万年历查询,或通过复杂的天文历法公式计算(因农历大小月、闰月等因素影响)。
- 时柱:以 2 小时为一个时辰(如 23:00-1:00 为子时),需用 “五鼠遁” 口诀根据日干推算时干。
1.3 代码实现
package sizhu;import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class sizhu {// 天干数组private static final String[] TIANGAN = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};// 地支数组private static final String[] DIZHI = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};// 月份地支数组,正月为寅,依次类推private static final String[] MONTH_DIZHI = {"寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子", "丑"};// 五虎遁年起月诀映射,用于根据年干确定月干private static final Map<Character, Integer> YEAR_MAP = new HashMap<>();// 五鼠遁日起时诀映射,用于根据日干确定时干private static final Map<Character, Integer> DAY_MAP = new HashMap<>();static {// 初始化五虎遁年起月诀映射YEAR_MAP.put('甲', 2);YEAR_MAP.put('乙', 4);YEAR_MAP.put('丙', 6);YEAR_MAP.put('丁', 8);YEAR_MAP.put('戊', 10);YEAR_MAP.put('己', 2);YEAR_MAP.put('庚', 4);YEAR_MAP.put('辛', 6);YEAR_MAP.put('壬', 8);YEAR_MAP.put('癸', 10);// 初始化五鼠遁日起时诀映射DAY_MAP.put('甲', 0);DAY_MAP.put('乙', 2);DAY_MAP.put('丙', 4);DAY_MAP.put('丁', 6);DAY_MAP.put('戊', 8);DAY_MAP.put('己', 0);DAY_MAP.put('庚', 2);DAY_MAP.put('辛', 4);DAY_MAP.put('壬', 6);DAY_MAP.put('癸', 8);}/*** 根据年份获取年柱* @param year 年份* @return 年柱,如 "甲辰"*/public static String getYearColumn(int year) {int tgIndex = (year - 3) % 10;int dzIndex = (year - 3) % 12;return TIANGAN[tgIndex] + DIZHI[dzIndex];}/*** 根据年柱和月份获取月柱* @param yearColumn 年柱* @param month 月份* @return 月柱,如 "丁卯"*/public static String getMonthColumn(String yearColumn, int month) {int tgIndex = YEAR_MAP.get(yearColumn.charAt(0)) + month - 1;tgIndex = tgIndex % 10;int dzIndex = month - 1;return TIANGAN[tgIndex] + MONTH_DIZHI[dzIndex];}/*** 根据蔡勒公式计算日柱,此处简化处理* 实际应用中需要完整实现蔡勒公式并进行精确计算* @param year 年份* @param month 月份* @param day 日期* @return 日柱,如 "丙午"*/public static String getDayColumn(int year, int month, int day) {// 蔡勒公式核心逻辑省略,这里简单假设一个固定结果int tgIndex = 0;int dzIndex = 0;return TIANGAN[tgIndex] + DIZHI[dzIndex];}/*** 根据日柱和时辰获取时柱* @param dayColumn 日柱* @param hour 时辰* @return 时柱,如 "戊子"*/public static String getHourColumn(String dayColumn, int hour) {int tgIndex = DAY_MAP.get(dayColumn.charAt(0)) + hour / 2;tgIndex = tgIndex % 10;int dzIndex = hour / 2;return TIANGAN[tgIndex] + DIZHI[dzIndex];}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入出生年份:");int year = scanner.nextInt();System.out.print("请输入出生月份:");int month = scanner.nextInt();System.out.print("请输入出生日期:");int day = scanner.nextInt();System.out.print("请输入出生时辰(0 - 23):");int hour = scanner.nextInt();// 计算年柱String yearColumn = getYearColumn(year);// 计算月柱String monthColumn = getMonthColumn(yearColumn, month);// 计算日柱String dayColumn = getDayColumn(year, month, day);// 计算时柱String hourColumn = getHourColumn(dayColumn, hour);System.out.println("八字为:" + yearColumn + " " + monthColumn + " " + dayColumn + " " + hourColumn);scanner.close();}
}
请输入出生年份:2006
请输入出生月份:2
请输入出生日期:15
请输入出生时辰(0 - 23):20
八字为:丁亥 癸卯 甲子 甲戌
1.4 代码分析
- 核心数据定义
- 定义了天干数组
TIANGAN
(甲到癸共 10 个) - 定义了地支数组
DIZHI
(子到亥共 12 个) - 定义了月份对应的地支数组
MONTH_DIZHI
(正月为寅,符合传统命理规则) - 定义了两个映射表用于计算月干和时干:
YEAR_MAP
:五虎遁年起月诀的映射关系DAY_MAP
:五鼠遁日起时诀的映射关系
- 定义了天干数组
- 静态初始化块
- 初始化了
YEAR_MAP
和DAY_MAP
的具体映射值,这些值是根据传统命理中的 “五虎遁” 和 “五鼠遁” 规则设定的
- 初始化了
- 核心方法
getYearColumn(int year)
:根据年份计算年柱getMonthColumn(String yearColumn, int month)
:根据年柱和月份计算月柱getDayColumn(int year, int month, int day)
:计算日柱(简化实现)getHourColumn(String dayColumn, int hour)
:根据日柱和时辰计算时柱
- 主方法
- 接收用户输入的出生年月日时
- 依次计算四柱并输出结果
二、五行
2.1 初识
- 木旺:主创造力、行动力,适合文化、教育、林业、设计等需 “生长”“拓展” 的领域。
- 火旺:主热情、表现力,适合能源、餐饮、演艺、公关等需 “展示”“沟通” 的领域。
- 土旺:主稳重、包容,适合建筑、农业、管理、行政等需 “踏实”“统筹” 的领域。
- 金旺:主果断、精准,适合金融、机械、法律、医疗等需 “严谨”“决断” 的领域。
- 水旺:主智慧、灵活,适合物流、旅游、科技、贸易等需 “流动”“应变” 的领域。
判断要点:若命局中某五行过旺,需通过事业 “疏导”(如木旺用火泄秀,从事火属性行业);若某五行过弱,需补其力量(如金弱,可从事金属性行业增强事业根基)。
2.2 原理
干支与五行的对应规则(核心依据)
每个天干、地支都有固定的五行属性,这是五行计算的基础:
- 天干五行:
甲、乙 → 木(甲为阳木,乙为阴木)
丙、丁 → 火(丙为阳火,丁为阴火)
戊、己 → 土(戊为阳土,己为阴土)
庚、辛 → 金(庚为阳金,辛为阴金)
壬、癸 → 水(壬为阳水,癸为阴水) - 地支五行:
寅、卯 → 木(寅为阳木,卯为阴木)
巳、午 → 火(巳为阴火,午为阳火)
辰、未、戌、丑 → 土(辰、戌为阳土;未、丑为阴土)
申、酉 → 金(申为阳金,酉为阴金)
亥、子 → 水(亥为阴水,子为阳水)
例:八字 “庚午、壬午、甲申、庚午” 中,天干 “庚、壬、甲” 分别对应金、水、木;地支 “午、午、申、午” 分别对应火、火、金、火。
2.3 代码实现
package wuxing;import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class wuxing {// 天干与五行的对应关系 - 修复变量名private static final Map<Character, String> TIAN_GAN_WU_XING = new HashMap<>();// 地支与五行的对应关系 - 修复变量名private static final Map<Character, String> DI_ZHI_WU_XING = new HashMap<>();static {// 初始化天干五行 - 这里的引用已经正确TIAN_GAN_WU_XING.put('甲', "木");TIAN_GAN_WU_XING.put('乙', "木");TIAN_GAN_WU_XING.put('丙', "火");TIAN_GAN_WU_XING.put('丁', "火");TIAN_GAN_WU_XING.put('戊', "土");TIAN_GAN_WU_XING.put('己', "土");TIAN_GAN_WU_XING.put('庚', "金");TIAN_GAN_WU_XING.put('辛', "金");TIAN_GAN_WU_XING.put('壬', "水");TIAN_GAN_WU_XING.put('癸', "水");// 初始化地支五行 - 这里的引用已经正确DI_ZHI_WU_XING.put('子', "水");DI_ZHI_WU_XING.put('丑', "土");DI_ZHI_WU_XING.put('寅', "木");DI_ZHI_WU_XING.put('卯', "木");DI_ZHI_WU_XING.put('辰', "土");DI_ZHI_WU_XING.put('巳', "火");DI_ZHI_WU_XING.put('午', "火");DI_ZHI_WU_XING.put('未', "土");DI_ZHI_WU_XING.put('申', "金");DI_ZHI_WU_XING.put('酉', "金");DI_ZHI_WU_XING.put('戌', "土");DI_ZHI_WU_XING.put('亥', "水");}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入四柱(年柱、月柱、日柱、时柱,用空格分隔,例如:丁亥 壬寅 甲子 丙寅):");String input = scanner.nextLine();// 修复:使用 \\s+ 正则表达式处理任意数量的空白字符分隔,并先trim去除首尾空格String[] pillars = input.trim().split("\\s+");// 验证输入是否正确 - 后续验证逻辑不变if (pillars.length != 4) {System.out.println("输入格式错误,请输入四个柱,用空格分隔");return;}for (String pillar : pillars) {if (pillar.length() != 2) {System.out.println("输入格式错误,每个柱应该由两个字组成:" + pillar);return;}}// 计算五行分布Map<String, Integer> fiveElements = calculateFiveElements(pillars);// 输出结果System.out.println("\n五行分布统计:");System.out.println("木:" + fiveElements.get("木"));System.out.println("火:" + fiveElements.get("火"));System.out.println("土:" + fiveElements.get("土"));System.out.println("金:" + fiveElements.get("金"));System.out.println("水:" + fiveElements.get("水"));scanner.close();}/*** 根据四柱计算五行分布*/private static Map<String, Integer> calculateFiveElements(String[] pillars) {Map<String, Integer> result = new HashMap<>();// 初始化五行计数result.put("木", 0);result.put("火", 0);result.put("土", 0);result.put("金", 0);result.put("水", 0);for (String pillar : pillars) {// 每个柱由一个天干和一个地支组成char tianGan = pillar.charAt(0); // 天干char diZhi = pillar.charAt(1); // 地支// 计算天干对应的五行并计数 - 已修复变量名引用String tgWx = TIAN_GAN_WU_XING.get(tianGan);if (tgWx != null) {result.put(tgWx, result.get(tgWx) + 1);} else {System.out.println("未知的天干:" + tianGan);}// 计算地支对应的五行并计数 - 已修复变量名引用String dzWx = DI_ZHI_WU_XING.get(diZhi);if (dzWx != null) {result.put(dzWx, result.get(dzWx) + 1);} else {System.out.println("未知的地支:" + diZhi);}}return result;}
}
请输入四柱(年柱、月柱、日柱、时柱,用空格分隔,例如:丁亥 壬寅 甲子 丙寅):
丁亥 癸卯 甲子 甲戌五行分布统计:
木:3
火:1
土:1
金:0
水:3
2.4 代码分析
1. main
方法(程序入口)
作为程序的控制中心,负责以下流程:
- 输入处理:通过
Scanner
接收用户输入的四柱信息(如 “丁亥 壬寅 甲子 丙寅”)。 - 输入校验:
- 检查输入的四柱数量是否为 4 个;
- 检查每个柱的长度是否为 2(确保 “天干 + 地支” 的格式);
若不符合格式,直接提示错误并终止程序,避免无效数据进入计算环节。
- 调用核心计算:将校验后的四柱数组传入
calculateFiveElements
方法,获取五行分布结果。 - 输出结果:打印五行(木、火、土、金、水)的数量统计。
- 资源释放:关闭
Scanner
,避免资源泄露。
2. calculateFiveElements
方法(核心计算)
作为工具方法,封装了五行分布的计算逻辑,具体职责:
- 初始化计数容器:创建
Map<String, Integer>
用于存储五行的数量,初始值均为 0。 - 遍历四柱:循环处理每个柱的天干和地支:
- 提取天干(每柱第 1 个字符)和地支(每柱第 2 个字符);
- 通过
TIAN_GAN_WU_XING
和DI_ZHI_WU_XING
映射表获取对应的五行; - 对获取到的五行进行计数(值 + 1)。
- 异常处理:若遇到未定义的天干 / 地支,打印提示信息(如 “未知的天干:X”),避免程序崩溃。
- 返回结果:将统计好的五行数量
Map
返回给主方法。
三、十神
3.1 初识
- 官杀(正官、七杀)
- 正官:代表正式职业、稳定事业、职场地位,主 “按部就班的成就”,如体制内工作、管理层职位,象征通过努力获得的认可。
- 七杀:代表挑战性事业、竞争环境、权力与风险,主 “突破性成就”,如创业、高压行业(金融、销售)、需要对抗竞争的领域。
- 判断要点:官杀需有力量(得月令、得生扶)但不过旺,且需 “制化得当”(如用印星化官杀为权,用食伤制七杀为功),否则易成压力或挫折。
- 印星(正印、偏印)
- 正印:代表学历、贵人扶持、稳定资源,主 “通过知识或长辈 / 平台获得事业基础”,适合教育、科研、文职等需专业积累的领域。
- 偏印:代表特殊技能、创意灵感、非传统路径,主 “通过独特能力或冷门领域突破”,适合设计、策划、自由职业等。
- 判断要点:印星为用(生扶日主且为喜用)时,易得贵人相助;若印星过旺压制食伤,则可能缺乏行动力,事业易停滞。
- 食伤(食神、伤官)
- 食神:代表才华、执行力、稳健输出,主 “通过技能稳步拓展事业”,适合技术岗、手工艺、管理等需耐心的领域。
- 伤官:代表创新、野心、突破规则,主 “通过创意或变革获得机会”,适合创业、艺术、新媒体等需灵活应变的领域。
- 判断要点:食伤是 “生财的源头”,需有力量流通(食伤生财),否则才华难以转化为事业成果;若食伤被官杀压制,则创意易受限制。
- 财星(正财、偏财)
- 正财:代表稳定收入、主业收益,主 “通过踏实工作积累财富”,事业倾向于保守、持续的领域。
- 偏财:代表意外机遇、副业收益,主 “通过资源整合或风险投资获得突破”,适合多元化经营、合作项目。
- 判断要点:财星需有源头(食伤生财),且不被劫财争夺,否则事业易因财务纠纷受阻;财星为用者,对事业的驱动力更强。
- 比肩、劫财
- 代表同辈、同事、竞争关系:比肩为喜用时,易得同辈相助,适合团队合作;劫财为忌时,易遇同行争夺资源,需防范合作风险。
3.2 原理
十神是根据日主(日干)与其他干支的五行生克关系,结合阴阳属性推导而出的十种符号,代表不同的人际关系和事物属性。
-
核心基准:以日主为中心
十神的计算均以日柱的天干(日主)为 “我”,其他干支(包括年干、月干、时干、年支、月支、日支、时支)与 “我” 的关系,构成十神。 -
生克关系与十神的对应(核心规则)
以 “我”(日主)为基准,根据 “生我、我生、克我、我克、同我” 五种关系,结合阴阳属性(阳与阳、阴与阴为同性,阳与阴、阴与阳为异性),衍生出十神:关系类型 同性(阳对阳 / 阴对阴) 异性(阳对阴 / 阴对阳) 同我(五行相同) 比肩 劫财 我生(我五行生彼) 食神 伤官 生我(彼五行生我) 偏印(枭神) 正印 我克(我五行克彼) 偏财 正财 克我(彼五行克我) 七杀(偏官) 正官 例:若日主为 “甲木”(阳木):
- 遇到 “甲木”(同我 + 同性)→ 比肩;遇到 “乙木”(同我 + 异性)→ 劫财。
- 遇到 “丙火”(我生 + 同性,甲木生丙火)→ 食神;遇到 “丁火”(我生 + 异性)→ 伤官。
- 遇到 “壬水”(生我 + 同性,壬水生甲木)→ 偏印;遇到 “癸水”(生我 + 异性)→ 正印。
- 遇到 “戊土”(我克 + 同性,甲木克戊土)→ 偏财;遇到 “己土”(我克 + 异性)→ 正财。
- 遇到 “庚金”(克我 + 同性,庚金克甲木)→ 七杀;遇到 “辛金”(克我 + 异性)→ 正官。
-
地支十神的计算
地支本身不直接对应十神,需通过以下两种方式推导:- 根据地支的五行属性,直接与日主对比(如日支为午火,日主为甲木,则午火为甲木的食神)。
- 根据地支藏干(如寅藏甲、丙、戊),以藏干的天干属性与日主对比,藏干的十神即代表地支的潜在十神属性。
3.3 代码实现
package shishen;import java.util.*;public class shishen {// 天干的阴阳属性: 阳为true,阴为falseprivate static final Map<Character, Boolean> tianGanYinYang = new HashMap<>();// 天干的五行属性private static final Map<Character, String> tianGanWuXing = new HashMap<>();// 地支的五行属性private static final Map<Character, String> diZhiWuXing = new HashMap<>();// 地支的阴阳属性private static final Map<Character, Boolean> diZhiYinYang = new HashMap<>();static {// 初始化天干阴阳属性tianGanYinYang.put('甲', true); // 阳tianGanYinYang.put('乙', false); // 阴tianGanYinYang.put('丙', true); // 阳tianGanYinYang.put('丁', false); // 阴tianGanYinYang.put('戊', true); // 阳tianGanYinYang.put('己', false); // 阴tianGanYinYang.put('庚', true); // 阳tianGanYinYang.put('辛', false); // 阴tianGanYinYang.put('壬', true); // 阳tianGanYinYang.put('癸', false); // 阴// 初始化天干五行tianGanWuXing.put('甲', "木");tianGanWuXing.put('乙', "木");tianGanWuXing.put('丙', "火");tianGanWuXing.put('丁', "火");tianGanWuXing.put('戊', "土");tianGanWuXing.put('己', "土");tianGanWuXing.put('庚', "金");tianGanWuXing.put('辛', "金");tianGanWuXing.put('壬', "水");tianGanWuXing.put('癸', "水");// 初始化地支五行diZhiWuXing.put('子', "水");diZhiWuXing.put('丑', "土");diZhiWuXing.put('寅', "木");diZhiWuXing.put('卯', "木");diZhiWuXing.put('辰', "土");diZhiWuXing.put('巳', "火");diZhiWuXing.put('午', "火");diZhiWuXing.put('未', "土");diZhiWuXing.put('申', "金");diZhiWuXing.put('酉', "金");diZhiWuXing.put('戌', "土");diZhiWuXing.put('亥', "水");// 初始化地支阴阳属性diZhiYinYang.put('子', true); // 阳diZhiYinYang.put('丑', false); // 阴diZhiYinYang.put('寅', true); // 阳diZhiYinYang.put('卯', false); // 阴diZhiYinYang.put('辰', true); // 阳diZhiYinYang.put('巳', false); // 阴diZhiYinYang.put('午', true); // 阳diZhiYinYang.put('未', false); // 阴diZhiYinYang.put('申', true); // 阳diZhiYinYang.put('酉', false); // 阴diZhiYinYang.put('戌', true); // 阳diZhiYinYang.put('亥', false); // 阴}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入四柱(年柱、月柱、日柱、时柱,用空格分隔,例如:丁亥 壬寅 甲子 丙寅):");String input = scanner.nextLine();String[] pillars = input.split(" ");// 验证输入是否正确if (pillars.length != 4) {System.out.println("输入格式错误,请输入四个柱,用空格分隔");return;}for (String pillar : pillars) {if (pillar.length() != 2) {System.out.println("输入格式错误,每个柱应该由两个字组成:" + pillar);return;}}// 获取日干(日柱的天干),作为参照点char riGan = pillars[2].charAt(0);System.out.println("\n日干(日主)为:" + riGan);System.out.println("日干五行:" + tianGanWuXing.get(riGan));System.out.println("日干阴阳:" + (tianGanYinYang.get(riGan) ? "阳" : "阴"));// 计算并输出十神及其五行System.out.println("\n十神分布及五行:");calculateAndPrintTenGods(pillars, riGan);scanner.close();}/*** 计算并打印十神及其五行*/private static void calculateAndPrintTenGods(String[] pillars, char riGan) {String riGanWuXing = tianGanWuXing.get(riGan);boolean riGanYang = tianGanYinYang.get(riGan);// 遍历四柱中的每个干支String[] positions = {"年干", "年支", "月干", "月支", "日干", "日支", "时干", "时支"};int index = 0;for (String pillar : pillars) {// 处理天干char tianGan = pillar.charAt(0);String wuXing = tianGanWuXing.get(tianGan);String tenGod = getTenGod(tianGan, true, riGanWuXing, riGanYang);System.out.println(positions[index++] + "(" + tianGan + "):" + tenGod + ",五行:" + wuXing);// 处理地支char diZhi = pillar.charAt(1);wuXing = diZhiWuXing.get(diZhi);tenGod = getTenGod(diZhi, false, riGanWuXing, riGanYang);System.out.println(positions[index++] + "(" + diZhi + "):" + tenGod + ",五行:" + wuXing);}}/*** 根据干支与日干的关系确定十神* @param ganZhi 干支字符* @param isTianGan 是否为天干* @param riGanWuXing 日干五行* @param riGanYang 日干是否为阳* @return 十神名称*/private static String getTenGod(char ganZhi, boolean isTianGan, String riGanWuXing, boolean riGanYang) {// 获取当前干支的五行和阴阳String wuXing = isTianGan ? tianGanWuXing.get(ganZhi) : diZhiWuXing.get(ganZhi);boolean yang = isTianGan ? tianGanYinYang.get(ganZhi) : diZhiYinYang.get(ganZhi);// 日干与当前干支为同一五行if (wuXing.equals(riGanWuXing)) {return yang == riGanYang ? "比肩" : "劫财";}// 判断五行生克关系if (isGenerating(wuXing, riGanWuXing)) {// 生我者为印星return yang == riGanYang ? "偏印" : "正印";} else if (isGenerating(riGanWuXing, wuXing)) {// 我生者为食伤return yang == riGanYang ? "食神" : "伤官";} else if (isRestraining(wuXing, riGanWuXing)) {// 克我者为官杀return yang == riGanYang ? "七杀" : "正官";} else if (isRestraining(riGanWuXing, wuXing)) {// 我克者为财星return yang == riGanYang ? "偏财" : "正财";}return "未知";}/*** 判断五行a是否生五行b (a生b)*/private static boolean isGenerating(String a, String b) {// 相生关系:木生火,火生土,土生金,金生水,水生木return (a.equals("木") && b.equals("火")) ||(a.equals("火") && b.equals("土")) ||(a.equals("土") && b.equals("金")) ||(a.equals("金") && b.equals("水")) ||(a.equals("水") && b.equals("木"));}/*** 判断五行a是否克五行b (a克b)*/private static boolean isRestraining(String a, String b) {// 相克关系:木克土,土克水,水克火,火克金,金克木return (a.equals("木") && b.equals("土")) ||(a.equals("土") && b.equals("水")) ||(a.equals("水") && b.equals("火")) ||(a.equals("火") && b.equals("金")) ||(a.equals("金") && b.equals("木"));}
}
请输入四柱(年柱、月柱、日柱、时柱,用空格分隔,例如:丁亥 壬寅 甲子 丙寅):
丁亥 癸卯 甲子 甲戌日干(日主)为:甲
日干五行:木
日干阴阳:阳十神分布及五行:
年干(丁):伤官,五行:火
年支(亥):正印,五行:水
月干(癸):正印,五行:水
月支(卯):劫财,五行:木
日干(甲):比肩,五行:木
日支(子):偏印,五行:水
时干(甲):比肩,五行:木
时支(戌):偏财,五行:土
3.4 代码分析
1. main
方法(流程控制中心)
- 输入处理:接收用户输入的四柱信息(如 “丁亥 壬寅 甲子 丙寅”),并进行格式校验(必须为 4 个柱,每柱 2 字),避免无效输入导致计算错误。
- 核心参数提取:从日柱中提取日干(
riGan
)—— 十神计算的基准点(“日主”),并打印日干的五行和阴阳属性,为后续分析提供参照。 - 调用工具方法:通过
calculateAndPrintTenGods
方法启动十神计算,并将结果输出到控制台。 - 资源释放:关闭
Scanner
,避免资源泄露。
2. calculateAndPrintTenGods
方法(十神计算与输出)
作为连接主方法与底层计算的 “桥梁”,负责:
- 参数准备:获取日干的五行(
riGanWuXing
)和阴阳(riGanYang
),作为十神判断的基准。 - 遍历四柱:按 “年→月→日→时” 的顺序,拆解每个柱的天干和地支,依次处理 8 个位置(年干、年支、月干、月支、日干、日支、时干、时支)。
- 位置标记:通过
positions
数组定义每个干支的位置名称(如 “年干”“月支”),使输出结果更易理解。 - 调用底层计算:对每个天干 / 地支,调用
getTenGod
方法计算对应的十神,并关联其五行属性,最终打印完整信息(如 “年干 (丁):正财,五行:火”)。
3. getTenGod
方法(十神判定核心逻辑)
十神计算的 “引擎”,基于以下规则推导十神名称:
-
获取当前干支的属性:根据是否为天干(
isTianGan
),从对应的Map
中提取五行(wuXing
)和阴阳(yang
)。 -
判断与日干的关系:
- 若与日干同五行(如日干为甲木,当前干支为乙木):根据阴阳是否相同,判定为 “比肩”(同性)或 “劫财”(异性)。
- 若为 “生我” 关系(如木生火,火为木所生):根据阴阳是否相同,判定为 “偏印”(同性)或 “正印”(异性)。
- 若为 “我生” 关系(如火生土,土为火所生):根据阴阳是否相同,判定为 “食神”(同性)或 “伤官”(异性)。
- 若为 “克我” 关系(如金克木,金克木):根据阴阳是否相同,判定为 “七杀”(同性)或 “正官”(异性)。
- 若为 “我克” 关系(如木克土,土为木所克):根据阴阳是否相同,判定为 “偏财”(同性)或 “正财”(异性)。
(注:生克关系的具体逻辑由辅助方法
isGenerating
和isRestraining
实现。)
四、流年
4.1 初识
一、流年干支的基础属性
- 流年天干:代表当年的 “显性事件”(如公开的机会、外部压力、人际关系变动),直接与原命局的天干发生作用(生、克、合等)。
- 例:若原命局日干为甲木(阳木),流年天干为庚金(阳金),则庚金是甲木的 “七杀”,可能当年会遇到竞争、挑战或突发任务。
- 流年地支:代表当年的 “隐性环境”(如内部资源变化、潜在机遇、基础运势),与原命局的地支发生刑、冲、合、害等关系,影响更深远。
- 例:流年地支为午火,原命局有子水,则 “子午相冲”,主当年易有变动(如搬家、换工作、情绪波动)。
二、流年与原命局的核心作用关系
- 五行生克:
- 流年五行生扶原命局的 “喜用神”:当年运势顺遂,如喜火者遇丙午年(火旺),事业、财运易有突破。
- 流年五行克制原命局的 “喜用神” 或生扶 “忌神”:当年多波折,如忌金者遇辛酉年(金旺),易遇压力或损失。
- 十神触发:
- 流年出现 “官杀”:可能涉及工作变动、职位调整、法律事务(正官主正规事务,七杀主突发挑战)。
- 流年出现 “财星”:与收入、投资、资源相关,为喜用则财运佳,为忌则易破财。
- 流年出现 “食伤”:主才华发挥、创意涌现,适合开拓新领域或开展副业。
- 流年出现 “印星”:易得贵人相助、学业 / 证书有进展,或生活环境更稳定。
- 流年出现 “比劫”:主同辈互动增多,可能有合作机会,也可能因竞争引发纠纷。
- 地支刑冲合害:
- 冲:主 “动”(变动、冲突),如寅申冲可能涉及出行、工作地点变化;子午冲可能影响情绪或健康。
- 合:主 “合”(合作、融合),如子丑合可能有合作机会或人际关系缓和;卯戌合可能有项目落地。
- 刑:主 “刑伤”(矛盾、损耗),如辰午酉亥自刑,易因自身失误引发问题;寅巳申三刑,需防人际关系冲突。
- 害:主 “暗害”(隐性麻烦),如子未害可能因小事引发纠纷,需防背后是非。
4.2 原理
流年指一个人出生后每一年的干支(如 2024 年甲辰、2025 年乙巳),其计算核心是以干支历法为基础,分析当年干支与原命局(四柱)的互动关系,从而推断该年的运势变化。
1. 流年干支的确定原理
- 干支循环规律:天干(甲、乙、丙… 癸)10 个,地支(子、丑、寅… 亥)12 个,二者组合形成 60 个 “干支组合”(60 年一循环),称为 “六十甲子”。
- 计算方法:以农历新年为分界(而非公历 1 月 1 日),根据具体年份对照 “六十甲子表” 确定流年干支。
例:2023 年农历新年后为 “癸卯年”,2024 年为 “甲辰年”,依此类推(可通过公式计算:流年干支 = (年份 - 3)÷ 60 的余数对应六十甲子)。
2. 流年与原命局的作用原理
流年的核心作用是 “动态触发” 原命局的潜在信息,具体通过以下关系实现:
- 五行生克:流年干支的五行(如甲辰年,甲属木、辰属土)与原命局五行发生生扶(如木生火)或克泄(如土克水)。
- 若流年五行生扶原命局的 “喜用神”(对命局有利的五行),则当年运势顺遂;
- 若生扶 “忌神”(对命局不利的五行),则当年多波折。
- 十神对应:流年干支以日主(日干)为基准,对应十神(如甲木日主遇庚金流年,庚金为七杀),直接关联该年的人事特征(如七杀代表竞争、变动)。
- 刑冲合害:流年地支与原命局地支发生特定关系(如子鼠年遇午马年为 “子午相冲”),引发不同的事件倾向:
- 冲:主变动、冲突(如工作调动、人际关系矛盾);
- 合:主合作、融合(如项目达成、人际关系缓和);
- 刑:主损耗、纠纷(如健康问题、合同纠纷);
- 害:主隐性麻烦(如背后是非、细节失误)。
4.3 代码实现
import java.util.*;// 修改类名,符合Java命名规范(首字母大写)
public class liunian {// 天干地支基础数据private static final String[] TIANGAN = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};private static final String[] DIZHI = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};// 天干五行映射private static final Map<Character, String> TIAN_GAN_WU_XING = new HashMap<>();// 地支五行映射private static final Map<Character, String> DI_ZHI_WU_XING = new HashMap<>();// 天干阴阳(阳为true,阴为false)private static final Map<Character, Boolean> TIAN_GAN_YINYANG = new HashMap<>();// 地支阴阳private static final Map<Character, Boolean> DI_ZHI_YINYANG = new HashMap<>();static {// 初始化天干数据TIAN_GAN_WU_XING.put('甲', "木");TIAN_GAN_WU_XING.put('乙', "木");TIAN_GAN_WU_XING.put('丙', "火");TIAN_GAN_WU_XING.put('丁', "火");TIAN_GAN_WU_XING.put('戊', "土");TIAN_GAN_WU_XING.put('己', "土");TIAN_GAN_WU_XING.put('庚', "金");TIAN_GAN_WU_XING.put('辛', "金");TIAN_GAN_WU_XING.put('壬', "水");TIAN_GAN_WU_XING.put('癸', "水");TIAN_GAN_YINYANG.put('甲', true);TIAN_GAN_YINYANG.put('乙', false);TIAN_GAN_YINYANG.put('丙', true);TIAN_GAN_YINYANG.put('丁', false);TIAN_GAN_YINYANG.put('戊', true);TIAN_GAN_YINYANG.put('己', false);TIAN_GAN_YINYANG.put('庚', true);TIAN_GAN_YINYANG.put('辛', false);TIAN_GAN_YINYANG.put('壬', true);TIAN_GAN_YINYANG.put('癸', false);// 初始化地支数据DI_ZHI_WU_XING.put('子', "水");DI_ZHI_WU_XING.put('丑', "土");DI_ZHI_WU_XING.put('寅', "木");DI_ZHI_WU_XING.put('卯', "木");DI_ZHI_WU_XING.put('辰', "土");DI_ZHI_WU_XING.put('巳', "火");DI_ZHI_WU_XING.put('午', "火");DI_ZHI_WU_XING.put('未', "土");DI_ZHI_WU_XING.put('申', "金");DI_ZHI_WU_XING.put('酉', "金");DI_ZHI_WU_XING.put('戌', "土");DI_ZHI_WU_XING.put('亥', "水");DI_ZHI_YINYANG.put('子', true);DI_ZHI_YINYANG.put('丑', false);DI_ZHI_YINYANG.put('寅', true);DI_ZHI_YINYANG.put('卯', false);DI_ZHI_YINYANG.put('辰', true);DI_ZHI_YINYANG.put('巳', false);DI_ZHI_YINYANG.put('午', true);DI_ZHI_YINYANG.put('未', false);DI_ZHI_YINYANG.put('申', true);DI_ZHI_YINYANG.put('酉', false);DI_ZHI_YINYANG.put('戌', true);DI_ZHI_YINYANG.put('亥', false);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输入四柱System.out.println("请输入四柱(年柱、月柱、日柱、时柱,空格分隔,如:丁亥 壬寅 甲子 丙寅):");String input = scanner.nextLine();// 修复:使用trim()和\\s+处理任意空格分隔String[] pillars = input.trim().split("\\s+");if (pillars.length != 4) {System.out.println("四柱输入错误!");return;}// 输入各干支的十神Map<String, String> shiShenMap = new HashMap<>();String[] positions = {"年干", "年支", "月干", "月支", "日干", "日支", "时干", "时支"};System.out.println("\n请依次输入以下位置的十神(直接输入十神名称):");for (String pos : positions) {System.out.print(pos + "(" + getGanZhiByPosition(pillars, pos) + "):");shiShenMap.put(pos, scanner.nextLine().trim());}// 添加:输入各干支的五行属性Map<String, String> wuXingInputMap = new HashMap<>();System.out.println("\n请依次输入以下位置的五行(木、火、土、金、水):");for (String pos : positions) {System.out.print(pos + "(" + getGanZhiByPosition(pillars, pos) + "):");wuXingInputMap.put(pos, scanner.nextLine().trim());}// 获取日主(日干)信息char riGan = pillars[2].charAt(0);String riZhuWuXing = TIAN_GAN_WU_XING.get(riGan);boolean riZhuYang = TIAN_GAN_YINYANG.get(riGan);System.out.println("\n日主(日干):" + riGan +",五行:" + riZhuWuXing +",阴阳:" + (riZhuYang ? "阳" : "阴"));// 输入目标年份System.out.println("\n请输入要查询的流年年份(如:2024):");int year = scanner.nextInt();scanner.nextLine(); // 消费换行符// 1. 计算流年干支String liuNianGanZhi = getLiuNianGanZhi(year);System.out.println("\n" + year + "年流年干支:" + liuNianGanZhi);char lnTianGan = liuNianGanZhi.charAt(0);char lnDiZhi = liuNianGanZhi.charAt(1);// 2. 自动计算流年干支的十神和五行String lnTgWuXing = TIAN_GAN_WU_XING.get(lnTianGan);String lnTgShiShen = getShiShen(lnTianGan, true, riGan);String lnDzWuXing = DI_ZHI_WU_XING.get(lnDiZhi);String lnDzShiShen = getShiShen(lnDiZhi, false, riGan);System.out.println("流年天干" + lnTianGan + ":十神=" + lnTgShiShen + ",五行=" + lnTgWuXing);System.out.println("流年地支" + lnDiZhi + ":十神=" + lnDzShiShen + ",五行=" + lnDzWuXing);// 3. 使用用户输入的五行属性(替换原自动计算五行的代码)Map<String, String> wuXingMap = wuXingInputMap;// 4. 显示原命局信息System.out.println("\n===== 原命局信息 =====");for (String pos : positions) {System.out.println(pos + ":" + getGanZhiByPosition(pillars, pos) +",十神:" + shiShenMap.get(pos) +",五行:" + wuXingMap.get(pos));}// 5. 显示流年信息System.out.println("\n===== " + year + "年流年信息 =====");System.out.println("流年干支:" + liuNianGanZhi);System.out.println("流年天干:" + lnTianGan + ",十神:" + lnTgShiShen + ",五行:" + lnTgWuXing);System.out.println("流年地支:" + lnDiZhi + ",十神:" + lnDzShiShen + ",五行:" + lnDzWuXing);// 6. 分析五行生克影响analyzeWuXingImpact(lnTgWuXing, lnDzWuXing, wuXingMap);// 7. 分析十神影响analyzeShiShenImpact(lnTgShiShen, lnDzShiShen, shiShenMap);// 8. 分析地支刑冲合害analyzeXingChong(lnDiZhi, pillars);scanner.close();}// 根据位置获取对应的干支private static String getGanZhiByPosition(String[] pillars, String position) {switch (position) {case "年干": return String.valueOf(pillars[0].charAt(0));case "年支": return String.valueOf(pillars[0].charAt(1));case "月干": return String.valueOf(pillars[1].charAt(0));case "月支": return String.valueOf(pillars[1].charAt(1));case "日干": return String.valueOf(pillars[2].charAt(0));case "日支": return String.valueOf(pillars[2].charAt(1));case "时干": return String.valueOf(pillars[3].charAt(0));case "时支": return String.valueOf(pillars[3].charAt(1));default: return "";}}// 计算流年干支private static String getLiuNianGanZhi(int year) {int offset = (year - 3) % 60;if (offset < 0) offset += 60;int tgIndex = offset % 10;int dzIndex = offset % 12;return TIANGAN[tgIndex] + DIZHI[dzIndex];}// 计算十神private static String getShiShen(char ganZhi, boolean isTianGan, char riGan) {String riGanWx = TIAN_GAN_WU_XING.get(riGan);boolean riGanYang = TIAN_GAN_YINYANG.get(riGan);String wx = isTianGan ? TIAN_GAN_WU_XING.get(ganZhi) : DI_ZHI_WU_XING.get(ganZhi);boolean yang = isTianGan ? TIAN_GAN_YINYANG.get(ganZhi) : DI_ZHI_YINYANG.get(ganZhi);if (wx.equals(riGanWx)) {return yang == riGanYang ? "比肩" : "劫财";} else if (isSheng(wx, riGanWx)) {return yang == riGanYang ? "偏印" : "正印";} else if (isSheng(riGanWx, wx)) {return yang == riGanYang ? "食神" : "伤官";} else if (isKe(wx, riGanWx)) {return yang == riGanYang ? "七杀" : "正官";} else if (isKe(riGanWx, wx)) {return yang == riGanYang ? "偏财" : "正财";}return "未知";}// 五行相生:a生bprivate static boolean isSheng(String a, String b) {return (a.equals("木") && b.equals("火")) ||(a.equals("火") && b.equals("土")) ||(a.equals("土") && b.equals("金")) ||(a.equals("金") && b.equals("水")) ||(a.equals("水") && b.equals("木"));}// 五行相克:a克bprivate static boolean isKe(String a, String b) {return (a.equals("木") && b.equals("土")) ||(a.equals("土") && b.equals("水")) ||(a.equals("水") && b.equals("火")) ||(a.equals("火") && b.equals("金")) ||(a.equals("金") && b.equals("木"));}// 分析五行生克影响private static void analyzeWuXingImpact(String lnTgWx, String lnDzWx, Map<String, String> yuanMingWuXing) {System.out.println("\n===== 五行生克影响分析 =====");// 五行相生关系Map<String, String> sheng = new HashMap<>();sheng.put("木", "火");sheng.put("火", "土");sheng.put("土", "金");sheng.put("金", "水");sheng.put("水", "木");// 五行相克关系Map<String, String> ke = new HashMap<>();ke.put("木", "土");ke.put("土", "水");ke.put("水", "火");ke.put("火", "金");ke.put("金", "木");// 分析流年天干对原命局的影响for (Map.Entry<String, String> entry : yuanMingWuXing.entrySet()) {String pos = entry.getKey();String wx = entry.getValue();if (sheng.getOrDefault(lnTgWx, "").equals(wx)) {System.out.println("流年天干五行" + lnTgWx + "生" + pos + "五行" + wx + ",增强其力量");} else if (ke.getOrDefault(lnTgWx, "").equals(wx)) {System.out.println("流年天干五行" + lnTgWx + "克" + pos + "五行" + wx + ",削弱其力量");}if (sheng.getOrDefault(lnDzWx, "").equals(wx)) {System.out.println("流年地支五行" + lnDzWx + "生" + pos + "五行" + wx + ",增强其力量");} else if (ke.getOrDefault(lnDzWx, "").equals(wx)) {System.out.println("流年地支五行" + lnDzWx + "克" + pos + "五行" + wx + ",削弱其力量");}}}// 分析十神影响private static void analyzeShiShenImpact(String lnTgShiShen, String lnDzShiShen, Map<String, String> yuanMingShiShen) {System.out.println("\n===== 十神影响分析 =====");// 十神关系简要说明Map<String, String> shiShenEffect = new HashMap<>();shiShenEffect.put("比肩", "代表同辈、朋友,可能有合作或竞争");shiShenEffect.put("劫财", "代表同辈、竞争者,可能有财物损耗");shiShenEffect.put("食神", "代表才华、福气,利于发挥能力");shiShenEffect.put("伤官", "代表创新、变动,可能有突破或是非");shiShenEffect.put("正财", "代表正财、稳定收入,利于财运");shiShenEffect.put("偏财", "代表偏财、意外之财,可能有额外收入");shiShenEffect.put("正官", "代表事业、压力,利于职位提升");shiShenEffect.put("七杀", "代表挑战、机遇,可能有重大变动");shiShenEffect.put("正印", "代表贵人、庇护,利于学习、获得支持");shiShenEffect.put("偏印", "代表灵感、研究,利于思考、特殊机遇");// 流年十神本身的影响System.out.println("流年天干十神" + lnTgShiShen + ":" + shiShenEffect.getOrDefault(lnTgShiShen, "未知影响"));System.out.println("流年地支十神" + lnDzShiShen + ":" + shiShenEffect.getOrDefault(lnDzShiShen, "未知影响"));// 流年十神与原命局十神的互动for (Map.Entry<String, String> entry : yuanMingShiShen.entrySet()) {String pos = entry.getKey();String ss = entry.getValue();if (lnTgShiShen.equals(ss)) {System.out.println("流年天干十神与" + pos + "十神相同(" + ss + "),该十神力量增强");}if (lnDzShiShen.equals(ss)) {System.out.println("流年地支十神与" + pos + "十神相同(" + ss + "),该十神力量增强");}}}// 分析地支刑冲合害private static void analyzeXingChong(char lnDz, String[] pillars) {System.out.println("\n===== 地支刑冲合害分析 =====");// 原命局地支List<Character> yuanMingDiZhi = new ArrayList<>();yuanMingDiZhi.add(pillars[0].charAt(1)); // 年支yuanMingDiZhi.add(pillars[1].charAt(1)); // 月支yuanMingDiZhi.add(pillars[2].charAt(1)); // 日支yuanMingDiZhi.add(pillars[3].charAt(1)); // 时支// 冲的关系Map<Character, Character> chong = new HashMap<>();chong.put('子', '午');chong.put('午', '子');chong.put('卯', '酉');chong.put('酉', '卯');chong.put('寅', '申');chong.put('申', '寅');chong.put('巳', '亥');chong.put('亥', '巳');chong.put('辰', '戌');chong.put('戌', '辰');chong.put('丑', '未');chong.put('未', '丑');// 合的关系Map<Character, Character> he = new HashMap<>();he.put('子', '丑');he.put('丑', '子');he.put('寅', '亥');he.put('亥', '寅');he.put('卯', '戌');he.put('戌', '卯');he.put('辰', '酉');he.put('酉', '辰');he.put('巳', '申');he.put('申', '巳');he.put('午', '未');he.put('未', '午');for (char dz : yuanMingDiZhi) {if (chong.containsKey(lnDz) && chong.get(lnDz) == dz) {System.out.println("流年地支" + lnDz + "与原命局地支" + dz + "相冲,可能有变动、冲突");}if (he.containsKey(lnDz) && he.get(lnDz) == dz) {System.out.println("流年地支" + lnDz + "与原命局地支" + dz + "相合,可能有合作、融合");}}}
}
请输入四柱(年柱、月柱、日柱、时柱,空格分隔,如:丁亥 壬寅 甲子 丙寅):
丁亥 癸卯 甲子 甲戌请依次输入以下位置的十神(直接输入十神名称):
年干(丁):伤官
年支(亥):正印
月干(癸):正印
月支(卯):劫财
日干(甲):比肩
日支(子):偏印
时干(甲):比肩
时支(戌):偏财请依次输入以下位置的五行(木、火、土、金、水):
年干(丁):火
年支(亥):水
月干(癸):水
月支(卯):木
日干(甲):木
日支(子):水
时干(甲):木
时支(戌):土日主(日干):甲,五行:木,阴阳:阳请输入要查询的流年年份(如:2024):
20252025年流年干支:丙午
流年天干丙:十神=食神,五行=火
流年地支午:十神=食神,五行=火===== 原命局信息 =====
年干:丁,十神:伤官,五行:火
年支:亥,十神:正印,五行:水
月干:癸,十神:正印,五行:水
月支:卯,十神:劫财,五行:木
日干:甲,十神:比肩,五行:木
日支:子,十神:偏印,五行:水
时干:甲,十神:比肩,五行:木
时支:戌,十神:偏财,五行:土===== 2025年流年信息 =====
流年干支:丙午
流年天干:丙,十神:食神,五行:火
流年地支:午,十神:食神,五行:火===== 五行生克影响分析 =====
流年天干五行火生时支五行土,增强其力量
流年地支五行火生时支五行土,增强其力量===== 十神影响分析 =====
流年天干十神食神:代表才华、福气,利于发挥能力
流年地支十神食神:代表才华、福气,利于发挥能力===== 地支刑冲合害分析 =====
流年地支午与原命局地支子相冲,可能有变动、冲突
4.4 代码分析
1. main
方法(总流程控制中心)
作为程序入口,负责统筹所有流程,核心职责包括:
- 输入处理:接收用户输入的四柱信息(年柱、月柱、日柱、时柱)、8 个位置(年干、年支等)的十神和五行属性,以及目标查询年份,同时进行基础格式校验(如四柱数量是否为 4)。
- 核心参数提取:从日柱中提取日干(日主),作为十神计算的基准,并展示日主的五行和阴阳属性。
- 流年干支计算:调用
getLiuNianGanZhi
方法计算目标年份的流年干支(如 2024 年甲辰),并拆解为流年天干和地支。 - 多维度分析触发:依次调用
getShiShen
(计算流年十神)、analyzeWuXingImpact
(五行生克分析)、analyzeShiShenImpact
(十神影响分析)、analyzeXingChong
(地支刑冲合害分析),串联各分析模块。 - 结果输出:分模块打印原命局信息、流年信息及各类分析结果,确保输出清晰有条理。
2. 基础工具方法(数据解析与计算)
getGanZhiByPosition
:根据位置(如 “年干”“月支”)从四柱中提取对应的干支字符(如年柱 “丁亥” 的年干为 “丁”,年支为 “亥”),为输入十神和五行时的位置提示提供支持。getLiuNianGanZhi
:根据目标年份计算流年干支,采用 “(年份 - 3) 取模 60” 的规则(与传统干支纪年法一致),返回如 “甲辰”“丙午” 等结果。getShiShen
:计算流年天干 / 地支相对于日主的十神,基于五行生克(如 “生我为印”“我克为财”)和阴阳属性(同性为偏、异性为正)推导,核心逻辑与十神计算的传统规则一致。
3. 分析类方法(多维度运势解读)
analyzeWuXingImpact
:分析流年五行与原命局五行的生克关系。通过预设 “五行相生”(木生火、火生土等)和 “五行相克”(木克土、土克水等)规则,判断流年天干 / 地支五行对原命局各位置五行的 “增强”(生)或 “削弱”(克)作用。analyzeShiShenImpact
:解读流年十神的含义及与原命局十神的互动。预设十神基础含义(如正财主稳定收入、七杀主挑战),并分析流年十神与原命局十神的 “同神增强” 效应(如流年正官与月干正官相同,则正官力量增强)。analyzeXingChong
:分析流年地支与原命局地支的刑冲合害关系。重点处理 “冲”(如子午冲、寅申冲)和 “合”(如子丑合、寅亥合)两种关系,分别对应 “变动冲突” 和 “合作融合” 的解读,符合传统命理中地支互动的核心规则。
五、格局
5.1 初识
八字格局是根据月令藏干透出的十神所确立的核心框架,直接影响事业的高低层次:
- 正官格、七杀格:若格局清纯(无刑冲克破),主事业有贵气,易在体制内或大型企业获得地位。
- 食神生财格、伤官生财格:主靠才华变现,适合自主创业或专业技术领域,事业成就与个人能力直接挂钩。
- 财生官杀格:主通过资源积累推动事业升级,适合商业经营或管理岗,易因财富提升社会地位。
- 印绶格:主靠知识或贵人扶持立足,适合学术、教育或背靠大平台的事业,稳定性强但突破较慢。
判断要点:格局成者(喜用有力、忌神受制),事业层次较高,易有大成就;格局败者(喜用被克、忌神无制),事业多波折,需通过后天努力弥补。
5.2 原理
格局是原命局(四柱)的核心框架,其计算以月令(月支)为 “提纲”,通过分析月令藏干的透出情况与十神配置,确定命局的核心势能与成败标准。
1. 格局的核心基准:月令提纲
- 月令(月支)是四柱中力量最强的地支,被称为 “提纲”,因其直接决定了命局中五行的旺衰(如寅卯月木旺、巳午月火旺),是格局的 “源头”。
- 格局必须围绕月令展开:月令藏干中力量最强的天干(本气)或透出到天干的藏干,是格局的核心十神。
2. 月令藏干的分析规则
地支(尤其是月令)通常藏有 1-3 个天干(称为 “藏干”),按力量强弱分为 “本气”(力量最强)、“中气”(次强)、“余气”(最弱),例如:
- 寅月(月支为寅)藏干为甲(本气,木)、丙(中气,火)、戊(余气,土);
- 丑月(月支为丑)藏干为己(本气,土)、辛(中气,金)、癸(余气,水)。
3. 格局的确立步骤
- 第一步:找月令藏干透出者
若月令藏干中的某一天干透出到年干、月干、时干(称为 “透出”),则以该透出的天干所对应的十神立格。
例:寅月(藏甲、丙、戊),若月干为丙火(透出),且日主为甲木(丙火是甲木的 “食神”),则立 “食神格”。 - 第二步:若藏干未透出,以月令本气立格
若月令藏干均未透出,则以月令本气对应的十神立格。
例:寅月(本气为甲木),若甲木未透出,日主为乙木(甲木与乙木同属木,为 “比肩”),则立 “比肩格”。 - 第三步:判断格局成败
格局的核心是 “用神得力、忌神受制”:- 用神:格局中需要扶持的十神(如官杀格需用印星化官杀,避免官杀克身);
- 忌神:破坏格局的十神(如正官格遇七杀混杂,七杀为忌)。
例:“食神生财格” 成格的条件是:食神有力(能生财)、财星有根(能承载食神之力)、无枭神(印星)夺食(避免食神被克),否则格局破败。
5.3 代码实现
import java.util.*;public class geju {// 天干地支基础数据private static final String[] TIANGAN = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};private static final String[] DIZHI = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};// 地支藏干映射 (本气, 中气, 余气)private static final Map<Character, List<Character>> DIZHI_CANGGAN = new HashMap<>();// 天干五行映射private static final Map<Character, String> TIAN_GAN_WU_XING = new HashMap<>();// 地支五行映射private static final Map<Character, String> DI_ZHI_WU_XING = new HashMap<>();// 天干阴阳 (阳为true,阴为false)private static final Map<Character, Boolean> TIAN_GAN_YINYANG = new HashMap<>();static {// 初始化地支藏干DIZHI_CANGGAN.put('子', Arrays.asList('癸'));DIZHI_CANGGAN.put('丑', Arrays.asList('己', '辛', '癸'));DIZHI_CANGGAN.put('寅', Arrays.asList('甲', '丙', '戊'));DIZHI_CANGGAN.put('卯', Arrays.asList('乙'));DIZHI_CANGGAN.put('辰', Arrays.asList('戊', '乙', '癸'));DIZHI_CANGGAN.put('巳', Arrays.asList('丙', '庚', '戊'));DIZHI_CANGGAN.put('午', Arrays.asList('丁', '己'));DIZHI_CANGGAN.put('未', Arrays.asList('己', '丁', '乙'));DIZHI_CANGGAN.put('申', Arrays.asList('庚', '壬', '戊'));DIZHI_CANGGAN.put('酉', Arrays.asList('辛'));DIZHI_CANGGAN.put('戌', Arrays.asList('戊', '丁', '辛'));DIZHI_CANGGAN.put('亥', Arrays.asList('壬', '甲'));// 初始化天干五行TIAN_GAN_WU_XING.put('甲', "木");TIAN_GAN_WU_XING.put('乙', "木");TIAN_GAN_WU_XING.put('丙', "火");TIAN_GAN_WU_XING.put('丁', "火");TIAN_GAN_WU_XING.put('戊', "土");TIAN_GAN_WU_XING.put('己', "土");TIAN_GAN_WU_XING.put('庚', "金");TIAN_GAN_WU_XING.put('辛', "金");TIAN_GAN_WU_XING.put('壬', "水");TIAN_GAN_WU_XING.put('癸', "水");// 初始化地支五行DI_ZHI_WU_XING.put('子', "水");DI_ZHI_WU_XING.put('丑', "土");DI_ZHI_WU_XING.put('寅', "木");DI_ZHI_WU_XING.put('卯', "木");DI_ZHI_WU_XING.put('辰', "土");DI_ZHI_WU_XING.put('巳', "火");DI_ZHI_WU_XING.put('午', "火");DI_ZHI_WU_XING.put('未', "土");DI_ZHI_WU_XING.put('申', "金");DI_ZHI_WU_XING.put('酉', "金");DI_ZHI_WU_XING.put('戌', "土");DI_ZHI_WU_XING.put('亥', "水");// 初始化天干阴阳TIAN_GAN_YINYANG.put('甲', true);TIAN_GAN_YINYANG.put('乙', false);TIAN_GAN_YINYANG.put('丙', true);TIAN_GAN_YINYANG.put('丁', false);TIAN_GAN_YINYANG.put('戊', true);TIAN_GAN_YINYANG.put('己', false);TIAN_GAN_YINYANG.put('庚', true);TIAN_GAN_YINYANG.put('辛', false);TIAN_GAN_YINYANG.put('壬', true);TIAN_GAN_YINYANG.put('癸', false);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入八字四柱(年柱、月柱、日柱、时柱,空格分隔,如:甲午 丙寅 辛丑 壬辰):");String input = scanner.nextLine().trim();String[] pillars = input.split("\\s+");if (pillars.length != 4) {System.out.println("输入错误,请输入四个柱!");return;}// 验证输入格式for (int i = 0; i < pillars.length; i++) {if (pillars[i].length() != 2) {System.out.println("第" + (i+1) + "柱格式错误,应为两个字符!");return;}}// 提取各柱信息char[] yearGan = {pillars[0].charAt(0)};char[] yearZhi = {pillars[0].charAt(1)};char[] monthGan = {pillars[1].charAt(0)};char[] monthZhi = {pillars[1].charAt(1)};char[] dayGan = {pillars[2].charAt(0)};char[] dayZhi = {pillars[2].charAt(1)};char[] hourGan = {pillars[3].charAt(0)};char[] hourZhi = {pillars[3].charAt(1)};// 收集所有天干Set<Character> allTiangan = new HashSet<>();allTiangan.add(yearGan[0]);allTiangan.add(monthGan[0]);allTiangan.add(dayGan[0]);allTiangan.add(hourGan[0]);// 显示基本信息System.out.println("\n===== 八字基本信息 =====");System.out.println("年柱:" + pillars[0] + " 月柱:" + pillars[1] + " 日柱:" + pillars[2] + " 时柱:" + pillars[3]);System.out.println("日主(日干):" + dayGan[0] + ",五行:" + TIAN_GAN_WU_XING.get(dayGan[0]));// 分析月令藏干System.out.println("\n===== 月令分析 =====");char yueLing = monthZhi[0];System.out.println("月令为:" + yueLing + ",五行:" + DI_ZHI_WU_XING.get(yueLing));List<Character> cangGan = DIZHI_CANGGAN.get(yueLing);System.out.println("月令藏干(本气、中气、余气):" + cangGan);// 查找透出的藏干List<Character> touChuGan = new ArrayList<>();for (Character gan : cangGan) {if (allTiangan.contains(gan)) {touChuGan.add(gan);}}if (!touChuGan.isEmpty()) {System.out.println("透出的藏干:" + touChuGan);} else {System.out.println("月令藏干均未透出");}// 手动输入十神(替换原自动计算逻辑)Map<Character, String> shiShenMap = new HashMap<>();System.out.println("\n请依次输入以下天干的十神(直接输入名称,如:比肩、正官):");// 按年干、月干、日干、时干顺序输入,明确对应关系String[] positions = {"年干", "月干", "日干", "时干"};char[] gans = {yearGan[0], monthGan[0], dayGan[0], hourGan[0]};for (int i = 0; i < positions.length; i++) {System.out.print(positions[i] + "(" + gans[i] + "):");shiShenMap.put(gans[i], scanner.nextLine().trim());}// 分析格局(使用用户输入的shiShenMap)String pattern = analyzePattern(dayGan[0], monthZhi[0], cangGan, touChuGan, shiShenMap);System.out.println("\n===== 格局分析结果 =====");System.out.println("此八字格局为:" + pattern);scanner.close();}// 分析格局private static String analyzePattern(char riGan, char yueLing, List<Character> cangGan,List<Character> touChuGan, Map<Character, String> shiShenMap) {// 1. 有透出的藏干,以透出的十神立格if (!touChuGan.isEmpty()) {// 优先考虑本气透出Character bengQi = cangGan.get(0);if (touChuGan.contains(bengQi)) {String shiShen = shiShenMap.get(bengQi);return getPatternName(shiShen) + "格(月令本气透出)";}// 没有本气透出则考虑中气或余气for (int i = 1; i < cangGan.size(); i++) {Character gan = cangGan.get(i);if (touChuGan.contains(gan)) {String shiShen = shiShenMap.get(gan);return getPatternName(shiShen) + "格(月令" + (i == 1 ? "中气" : "余气") + "透出)";}}}// 2. 藏干未透出,以月令本气立格Character benQi = cangGan.get(0);String benQiWuXing = TIAN_GAN_WU_XING.get(benQi);String riGanWuXing = TIAN_GAN_WU_XING.get(riGan);boolean riGanYang = TIAN_GAN_YINYANG.get(riGan);boolean benQiYang = TIAN_GAN_YINYANG.get(benQi);String shiShen;if (benQiWuXing.equals(riGanWuXing)) {shiShen = benQiYang == riGanYang ? "比肩" : "劫财";} else if (isSheng(benQiWuXing, riGanWuXing)) {shiShen = benQiYang == riGanYang ? "偏印" : "正印";} else if (isSheng(riGanWuXing, benQiWuXing)) {shiShen = benQiYang == riGanYang ? "食神" : "伤官";} else if (isKe(benQiWuXing, riGanWuXing)) {shiShen = benQiYang == riGanYang ? "七杀" : "正官";} else if (isKe(riGanWuXing, benQiWuXing)) {shiShen = benQiYang == riGanYang ? "偏财" : "正财";} else {return "特殊格局(无法直接判定)";}return getPatternName(shiShen) + "格(月令本气未透出)";}// 获取格局名称private static String getPatternName(String shiShen) {switch (shiShen) {case "正官": return "正官";case "七杀": return "七杀";case "正财": return "正财";case "偏财": return "偏财";case "正印": return "正印";case "偏印": return "偏印";case "食神": return "食神";case "伤官": return "伤官";case "比肩": return "比肩";case "劫财": return "劫财";default: return "特殊";}}// 五行相生:a生bprivate static boolean isSheng(String a, String b) {return (a.equals("木") && b.equals("火")) ||(a.equals("火") && b.equals("土")) ||(a.equals("土") && b.equals("金")) ||(a.equals("金") && b.equals("水")) ||(a.equals("水") && b.equals("木"));}// 五行相克:a克bprivate static boolean isKe(String a, String b) {return (a.equals("木") && b.equals("土")) ||(a.equals("土") && b.equals("水")) ||(a.equals("水") && b.equals("火")) ||(a.equals("火") && b.equals("金")) ||(a.equals("金") && b.equals("木"));}
}
请输入八字四柱(年柱、月柱、日柱、时柱,空格分隔,如:甲午 丙寅 辛丑 壬辰):
丁亥 癸卯 甲子 甲戌===== 八字基本信息 =====
年柱:丁亥 月柱:癸卯 日柱:甲子 时柱:甲戌
日主(日干):甲,五行:木===== 月令分析 =====
月令为:卯,五行:木
月令藏干(本气、中气、余气):[乙]
月令藏干均未透出请依次输入以下天干的十神(直接输入名称,如:比肩、正官):
年干(丁):伤官
月干(癸):正印
日干(甲):比肩、
时干(甲):比肩===== 格局分析结果 =====
此八字格局为:劫财格(月令本气未透出)进程已结束,退出代码为 0
5.4 代码分析
1. main
方法(流程控制中心)
作为程序入口,负责统筹所有分析步骤,核心职责包括:
- 输入处理与校验:接收用户输入的四柱信息,检查格式合法性(必须为 4 个柱,每柱 2 字),避免无效输入导致的计算错误。
- 基础信息提取:拆解四柱为年、月、日、时的天干和地支,收集所有天干(用于判断藏干是否透出),并提取日主(日干)作为分析基准。
- 基本信息展示:打印八字四柱、日主及五行属性,为后续分析提供直观参考。
- 月令分析:聚焦 “月令”(月支)这一格局核心,展示月令的五行、藏干(本气、中气、余气)及透出情况(藏干是否出现在四柱天干中)。
- 格局推导触发:调用
analyzePattern
方法,传入月令藏干、透出情况及十神映射,最终打印格局分析结果。
2. 核心工具方法
analyzePattern
(格局推导核心逻辑):
格局分析的核心方法,遵循 “以月令为提纲” 的传统规则,分两步推导格局:- 若有藏干透出:优先以透出的藏干立格(本气透出优先,其次中气、余气),根据用户输入的十神名称确定格局(如透出藏干为正官则为正官格)。
- 若藏干未透出:以月令本气立格,通过本气与日主的五行生克(如本气生日主为印星)和阴阳关系(如同性为偏印)推导十神,进而确定格局。
getPatternName
(格局名称映射):
将十神名称转换为对应的格局名称(如 “正官”→“正官格”、“食神”→“食神格”),简化格局结果的输出。isSheng
/isKe
(五行生克判断):
辅助方法,判断五行间的相生(如木生火)、相克(如木克土)关系,为十神推导提供生克逻辑基础(如 “生我为印”“我克为财”)。
六、结果解读
根据上述程序,我们可以得到四柱,五行,十神及对应的五行,流年大运,格局月令,我们可以把结果为给DeepSeek即可得出结果的解读:比如:
四柱:丁亥 癸卯 甲子 甲戌五行:
木:3
火:1
土:1
金:0
水:3十神:
日干(日主)为:甲
日干五行:木
日干阴阳:阳
十神分布及五行:
年干(丁):伤官,五行:火
年支(亥):正印,五行:水
月干(癸):正印,五行:水
月支(卯):劫财,五行:木
日干(甲):比肩,五行:木
日支(子):偏印,五行:水
时干(甲):比肩,五行:木
时支(戌):偏财,五行:土流年:
===== 2025年流年信息 =====
流年干支:丙午
流年天干:丙,十神:食神,五行:火
流年地支:午,十神:食神,五行:火===== 五行生克影响分析 =====
流年天干五行火生时支五行土,增强其力量
流年地支五行火生时支五行土,增强其力量===== 十神影响分析 =====
流年天干十神食神:代表才华、福气,利于发挥能力
流年地支十神食神:代表才华、福气,利于发挥能力===== 地支刑冲合害分析 =====
流年地支午与原命局地支子相冲,可能有变动、冲突月令:
月令为:卯,五行:木
月令藏干(本气、中气、余气):[乙]
月令藏干均未透出格局:
劫财格(月令本气未透出)
提示词:
我要根据八字来测算我的事业运,一下是基本信息,请根据这些,给我详细解读:
四柱:丁亥 癸卯 甲子 甲戌五行:
木:3
火:1
土:1
金:0
水:3十神:
日干(日主)为:甲
日干五行:木
日干阴阳:阳
十神分布及五行:
年干(丁):伤官,五行:火
年支(亥):正印,五行:水
月干(癸):正印,五行:水
月支(卯):劫财,五行:木
日干(甲):比肩,五行:木
日支(子):偏印,五行:水
时干(甲):比肩,五行:木
时支(戌):偏财,五行:土流年:
===== 2025年流年信息 =====
流年干支:丙午
流年天干:丙,十神:食神,五行:火
流年地支:午,十神:食神,五行:火===== 五行生克影响分析 =====
流年天干五行火生时支五行土,增强其力量
流年地支五行火生时支五行土,增强其力量===== 十神影响分析 =====
流年天干十神食神:代表才华、福气,利于发挥能力
流年地支十神食神:代表才华、福气,利于发挥能力===== 地支刑冲合害分析 =====
流年地支午与原命局地支子相冲,可能有变动、冲突月令:
月令为:卯,五行:木
月令藏干(本气、中气、余气):[乙]
月令藏干均未透出格局:
劫财格(月令本气未透出)
以下是DS的解读:
### **命局核心特点**
1. **日主甲木**: 生于卯月(木旺之春),得月令强根,地支亥卯半合木局,时支戌中藏余气根,天干两甲木比肩相助,日主身强无疑。木主仁、进取心强,但过旺需金修剪,命局缺金(无官杀),自我约束力稍弱。2. **五行流通**: - **水木成势**:水(印星)生木(比劫),能量集中于木,需火土调和。 - **火土弱而待用**:年干丁火伤官、时支戌土偏财为用神,但丁火被癸水压制,戌土被卯木合克(卯戌合火不化),用神力量不足,需大运流年引动。3. **十神配置**: - **印星过旺**(年支亥、月干癸、日支子):主依赖心重,易思虑过多,需伤官(丁火)泄秀展现才华。 - **比劫林立**(月支卯、时干甲):竞争压力大,合作中易有资源争夺。 - **时支偏财(戌)**:为事业关键点,需通过专业技能(火土)获取财富。---### **事业方向建议**
- **用神为火土**:火(食伤)代表创意、技能、表达,土(财星)代表实业、资源整合。适合从事技术、教育、文化创意、贸易或需专业门槛的行业(如互联网、设计、咨询)。
- **规避纯木水行业**:如农林、航海等,易加剧五行失衡。
- **合作需谨慎**:比劫多,合伙易生竞争,宜独立负责核心业务。---### **2025年(丙午流年)事业分析**
1. **流年双食神(丙午)**: - 丙火透干,食神泄秀,才华有展现机会,利提案、创作、技术输出。 - 午火生时支戌土(偏财),收入渠道可能拓宽,但需主动争取(火为虚透,需落地为土)。2. **子午冲(日支逢冲)**: - 工作环境或岗位易变动(如团队调整、项目转向),可能引发短暂压力,但冲开子水印星束缚,反能突破保守思维。 - 注意情绪管理(子水为印,冲则心绪波动)。3. **劫财格逢食神**: - 竞争力转化为优势,可通过独特技能脱颖而出,避免卷入人际纠纷(比劫暗藏竞争)。---### **长期发展建议**
- **补足火土能量**: 增强执行力(火)与务实规划(土),避免理想化。可专注技术深耕,或通过自媒体、线上平台(火属性)扩大影响。
- **借流年引动财星**: 2025年把握丙午火势,推动项目落地,偏财戌土被生旺,可尝试副业或投资。
- **39岁后行土运(未申酉戌)**: 中年土金运助财官,事业积累将迎来质变,前期需扎实铺垫。---### **总结**
您命局如**强木待雕琢**,需火(才华)引燃、土(平台)扎根。2025年流年如东风助力,宜主动展示能力,接纳变动为机遇。注意平衡竞争关系,聚焦技术或创意变现,中年后财星得地,事业可步步攀升。
七、总结
博主也只是略懂皮毛,不可避免文章中会有错误,也恳请大家的批评指正。另外,事在人为,大家仅供娱乐就好,不可盲目的相信。这个系列博主也更新了很多文章,下一期的选题大家可以私信博主或在评论区打出。感谢大家的支持,等博主的技术再精进一点,争取做出完整的小程序或APP,大家尽情期待!
文献参考:《周易》