在六爻预测(又称"纳甲筮法")中,农历和干支具有非常重要的作用,主要体现在以下几个方面:
简介
一、农历的作用
-
确定起卦时间
六爻起卦通常以问事的具体时间 为依据。传统上使用的是农历(阴历)日期,因为六爻体系建立在中国古代历法基础上,与节气、月建等密切相关。
-
划分月建与日辰
- 月建:指农历月份的地支,如正月建寅、二月建卯......十二月建丑。月建代表当月的旺衰力量,对卦中各爻有生克冲合的影响。
- 日辰:指农历当日的干支(天干+地支),是判断爻之旺衰、动静、应期的关键因素。
-
节气转换的依据
虽然用农历月份,但月建的真正切换是以节气为准(如立春换年柱、惊蛰换二月建卯等)。因此,准确排盘需结合节气,而非单纯按农历初一。
二、干支的作用
-
日干支(日辰)------最关键的因素之一
- 日辰是六爻断卦的"提纲",能:
- 生扶或克制卦中爻;
- 冲、合、刑、害卦中爻;
- 决定爻的旺相休囚死;
- 判断应期(事情发生的时间)。
- 例如:子日冲午爻,称为"日破";若午爻本就衰弱,则更凶。
- 日辰是六爻断卦的"提纲",能:
-
月干支(月建)------决定爻的旺衰
- 月建主一月之权,影响力仅次于日辰。
- 爻得月建生扶则旺,被月建克制则衰。
- 有"月建掌权,日辰执令"之说。
-
年、时干支的辅助作用
- 年干支主要用于看大运、流年影响,或在特定情况下(如终身卦)参考。
- 时辰干支有时用于细化应期或辅助判断动爻状态。
-
干支与五行、六亲的对应
- 天干地支都对应五行(如甲乙木、寅卯木),进而影响卦中六亲(父母、兄弟、妻财、子孙、官鬼)的强弱与关系。
- 通过干支可判断世应关系、用神选取是否得时得地。
-
空亡的判定
- 空亡由日干支推算(如甲子旬中戌亥空),对判断爻是否"有力"至关重要。
- 空亡之爻即使旺相,也暂时无力,待出空或冲空时方应事。
三、实际应用举例
- 若问财运,用神为妻财爻:
- 若妻财爻临月建或得日辰生扶 → 财旺,吉;
- 若妻财爻被日辰冲破或月建克制 → 财衰,凶;
- 若妻财爻旬空 → 暂无财,待出空之日/月可能得财。
总结
| 要素 | 作用 |
|---|---|
| 农历日期 | 提供起卦时间基础,用于确定月建、日辰 |
| 月建(地支) | 主一月之旺衰,影响爻的强弱 |
| 日辰(干支) | 最关键的外部力量,决定爻的生克、冲合、旺衰、应期、空亡等 |
| 干支系统 | 构建五行生克网络,连接卦象与现实时空,是六爻"天人合一"思想的核心体现 |
⚠️ 注意:现代有人用公历直接起卦,但严格来说,六爻必须转换为农历+节气校正后的干支才能准确断卦。
代码实现
核心实现是使用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参数。