Java实现周易六爻自动排盘:根据起卦的公历时间换算农和干支时间,推算日柱空亡(旬空)

在六爻预测(又称"纳甲筮法")中,农历和干支具有非常重要的作用,主要体现在以下几个方面:


简介

一、农历的作用

  1. 确定起卦时间

    六爻起卦通常以问事的具体时间 为依据。传统上使用的是农历(阴历)日期,因为六爻体系建立在中国古代历法基础上,与节气、月建等密切相关。

  2. 划分月建与日辰

    • 月建:指农历月份的地支,如正月建寅、二月建卯......十二月建丑。月建代表当月的旺衰力量,对卦中各爻有生克冲合的影响。
    • 日辰:指农历当日的干支(天干+地支),是判断爻之旺衰、动静、应期的关键因素。
  3. 节气转换的依据

    虽然用农历月份,但月建的真正切换是以节气为准(如立春换年柱、惊蛰换二月建卯等)。因此,准确排盘需结合节气,而非单纯按农历初一。


二、干支的作用

  1. 日干支(日辰)------最关键的因素之一

    • 日辰是六爻断卦的"提纲",能:
      • 生扶或克制卦中爻;
      • 冲、合、刑、害卦中爻;
      • 决定爻的旺相休囚死;
      • 判断应期(事情发生的时间)。
    • 例如:子日冲午爻,称为"日破";若午爻本就衰弱,则更凶。
  2. 月干支(月建)------决定爻的旺衰

    • 月建主一月之权,影响力仅次于日辰。
    • 爻得月建生扶则旺,被月建克制则衰。
    • 有"月建掌权,日辰执令"之说。
  3. 年、时干支的辅助作用

    • 年干支主要用于看大运、流年影响,或在特定情况下(如终身卦)参考。
    • 时辰干支有时用于细化应期或辅助判断动爻状态。
  4. 干支与五行、六亲的对应

    • 天干地支都对应五行(如甲乙木、寅卯木),进而影响卦中六亲(父母、兄弟、妻财、子孙、官鬼)的强弱与关系。
    • 通过干支可判断世应关系、用神选取是否得时得地。
  5. 空亡的判定

    • 空亡由日干支推算(如甲子旬中戌亥空),对判断爻是否"有力"至关重要。
    • 空亡之爻即使旺相,也暂时无力,待出空或冲空时方应事。

三、实际应用举例

  • 若问财运,用神为妻财爻:
    • 若妻财爻临月建或得日辰生扶 → 财旺,吉;
    • 若妻财爻被日辰冲破或月建克制 → 财衰,凶;
    • 若妻财爻旬空 → 暂无财,待出空之日/月可能得财。

总结

要素 作用
农历日期 提供起卦时间基础,用于确定月建、日辰
月建(地支) 主一月之旺衰,影响爻的强弱
日辰(干支) 最关键的外部力量,决定爻的生克、冲合、旺衰、应期、空亡等
干支系统 构建五行生克网络,连接卦象与现实时空,是六爻"天人合一"思想的核心体现

⚠️ 注意:现代有人用公历直接起卦,但严格来说,六爻必须转换为农历+节气校正后的干支才能准确断卦。


代码实现

核心实现是使用Hutool Java 工具库。其中,cn.hutool.core.date 包中包含了对农历(阴历)的支持,主要通过 LunarDate 类和 ChineseDate 类(不同版本可能略有差异)来实现。

下面是一个使用 Hutool 计算农历时间和干支的示例(以较新版本为例,推荐使用 Hutool 5.8+):


✅ 示例:将公历日期转为农历时间、干支时间、计算日柱空亡

java 复制代码
import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.chinese.GanZhi;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class GanZhiCalendar {

    // 十天干
    private static final String[] TIAN_GAN = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};

    // 十二地支
    private static final String[] DI_ZHI = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
    // 旬首(甲X)与空亡地支的映射
    private static final Map<String, String> XUN_KONG = new HashMap<>();

    static {
        XUN_KONG.put("甲子", "戌亥");
        XUN_KONG.put("甲戌", "申酉");
        XUN_KONG.put("甲申", "午未");
        XUN_KONG.put("甲午", "辰巳");
        XUN_KONG.put("甲辰", "寅卯");
        XUN_KONG.put("甲寅", "子丑");
    }

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(" 农历:" + GanZhiCalendar.toLunarDate(now));
        System.out.println(" 干支:" + GanZhiCalendar.toGanZhi(now));
        System.out.println(" 日空:" + GanZhiCalendar.getKongWang(now));
    }

    public static String getDayGanZhi(LocalDateTime date) {
        return GanZhi.getGanzhiOfDay(date.getYear(), date.getMonthValue(), date.getDayOfMonth());
    }
    public static String toDayGan(LocalDateTime date) {
        return getDayGanZhi(date).substring(0, 1);
    }

    public static String toLunarDate(LocalDateTime date) {
        ChineseDate lunar = new ChineseDate(date.toLocalDate());
        return lunar.getChineseYear() + "年" + lunar.getChineseMonth() + "月" + lunar.getChineseDay() + "日" + getDiZhiHour(date) + "时";
    }


    public static String toGanZhi(LocalDateTime date) {
        ChineseDate lunar = new ChineseDate(date.toLocalDate());
        String ganZhi = lunar.getCyclicalYMD();
        ganZhi = ganZhi.replace("年", "年 ");
        ganZhi = ganZhi.replace("月", "月 ");
        return ganZhi + " " + getGanZhiHour(date);
    }




    private static String getDiZhiHour(LocalDateTime date) {
        int hour = date.getHour();
        int shichen = (hour + 1) / 2 % 12; // 0=子,1=丑,...,11=亥
        if (hour == 23) shichen = 0; // 特殊处理23点属于子时
        return DI_ZHI[shichen];
    }

    private static String getGanZhiHour(LocalDateTime date) {
        int hour = date.getHour();
        int shichen = (hour + 1) / 2 % 12; // 0=子,1=丑,...,11=亥
        if (hour == 23) shichen = 0; // 特殊处理23点属于子时
        String dayGan = toDayGan(date);
        int dayGanIndex = Arrays.asList(TIAN_GAN).indexOf(dayGan);
        // 五鼠遁口诀:
        // 甲己还加甲,乙庚丙作初,
        // 丙辛从戊起,丁壬庚子居,
        // 戊癸何方发,壬子是真途。
        int ziShiGanIndex = switch (dayGanIndex) {
            case 0, 5 -> // 甲、己
                    0; // 甲
            case 1, 6 -> // 乙、庚
                    2; // 丙
            case 2, 7 -> // 丙、辛
                    4; // 戊
            case 3, 8 -> // 丁、壬
                    6; // 庚
            case 4, 9 -> // 戊、癸
                    8; // 壬
            default -> 0;
        };
        int ganIndex = (ziShiGanIndex + shichen) % 10;
        return TIAN_GAN[ganIndex] + getDiZhiHour(date) + "时";
    }

    /**
     * 根据日干支(如"丙申")计算空亡地支
     *
     * @return 空亡地支数组,如 ["辰", "巳"]
     */
    public static String getKongWang(LocalDateTime  date) {
        String dayGanZhi= getDayGanZhi(date);
        if (dayGanZhi.length() != 2) {
            throw new IllegalArgumentException("日干支格式错误,应为两个字,如'丙申'");
        }

        String gan = dayGanZhi.substring(0, 1);
        String zhi = dayGanZhi.substring(1, 2);

        // 找天干在TG中的索引
        int ganIndex = -1;
        for (int i = 0; i < TIAN_GAN.length; i++) {
            if (TIAN_GAN[i].equals(gan)) {
                ganIndex = i;
                break;
            }
        }
        if (ganIndex == -1) {
            throw new IllegalArgumentException("无效天干: " + gan);
        }

        // 找地支在DZ中的索引
        int zhiIndex = -1;
        for (int i = 0; i < DI_ZHI.length; i++) {
            if (DI_ZHI[i].equals(zhi)) {
                zhiIndex = i;
                break;
            }
        }
        if (zhiIndex == -1) {
            throw new IllegalArgumentException("无效地支: " + zhi);
        }

        // 计算旬首地支索引:当前地支索引 - 天干偏移(甲=0,所以偏移就是ganIndex)
        int xunShouZhiIndex = (zhiIndex - ganIndex + 12) % 12;
        String xunShouZhi = DI_ZHI[xunShouZhiIndex];
        String xunShou = "甲" + xunShouZhi;

        // 获取空亡
        String kong = XUN_KONG.get(xunShou);
        if (kong == null) {
            throw new IllegalStateException("未找到旬首 " + xunShou + " 对应的空亡");
        }

        return kong;
    }


}
示例输出
bash 复制代码
 农历:2025年十月月廿二日酉时
 干支:乙巳年 戊子月 甲寅日 癸酉时
 日空:子丑

📦 Maven 依赖(确保使用较新版本)

xml 复制代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.22</version> <!-- 推荐使用最新版 -->
</dependency>

截至 2025 年,建议使用 5.8.x 或 5.9.x 版本,对农历支持更完善。


🔔 注意事项

  • Hutool 的农历计算基于紫金历法(传统中国农历规则),适用于一般节日、生日等场景。
  • 农历闰月处理需特别注意 isLeapMonth() 和构造时传入的 isLeapMonth 参数。

相关推荐
一只游鱼2 小时前
我的第一个微服务项目cy-fang1.0
java·后端·spring cloud
缘来是庄2 小时前
invalid comparison
java·spring boot·mybatis
哈哈哈笑什么2 小时前
3 次生产系统崩溃复盘:Java 后端从踩坑到封神的排查优化之路
java·后端·性能优化
用户3721574261352 小时前
如何在 Java 中将 RTF 转换为 PDF (含批量转换)
java
Smile丶凉轩2 小时前
C++ 高性能内存池面试题总结
开发语言·c++
世转神风-2 小时前
qt-pro文件名词解释
开发语言·qt
Fantastic_sj3 小时前
[代码例题] var 和 let 在循环中的作用域差异,以及闭包和事件循环的影响
开发语言·前端·javascript
谷哥的小弟3 小时前
Spring Framework源码解析——ApplicationContextException
java·spring·源码
学到头秃的suhian3 小时前
Springboot进阶知识
java·spring boot·spring