1
0
mirror of synced 2026-10-15 11:06:11 +08:00
Files
lunar-java/src/main/java/com/nlf/calendar/LunarTime.java

391 lines
8.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.nlf.calendar;
import com.nlf.calendar.util.LunarUtil;
import java.util.List;
import java.util.Map;
/**
* 时辰
*
* @author 6tail
*/
public class LunarTime {
/**
* 天干下标,0-9
*/
private final int ganIndex;
/**
* 地支下标,0-11
*/
private final int zhiIndex;
/**
* 阴历
*/
private final Lunar lunar;
public LunarTime(int lunarYear, int lunarMonth, int lunarDay, int hour, int minute, int second) {
this.lunar = Lunar.fromYmdHms(lunarYear, lunarMonth, lunarDay, hour, minute, second);
this.zhiIndex = LunarUtil.getTimeZhiIndex(String.format("%02d:%02d", hour, minute));
this.ganIndex = (lunar.getDayGanIndexExact() % 5 * 2 + zhiIndex) % 10;
}
public static LunarTime fromYmdHms(int lunarYear, int lunarMonth, int lunarDay, int hour, int minute, int second) {
return new LunarTime(lunarYear, lunarMonth, lunarDay, hour, minute, second);
}
public int getGanIndex() {
return ganIndex;
}
public int getZhiIndex() {
return zhiIndex;
}
/**
* 获取生肖
*
* @return 生肖,如虎
*/
public String getShengXiao() {
return LunarUtil.SHENGXIAO[zhiIndex + 1];
}
/**
* 获取地支
*
* @return 地支
*/
public String getZhi() {
return LunarUtil.ZHI[zhiIndex + 1];
}
/**
* 获取天干
*
* @return 天干
*/
public String getGan() {
return LunarUtil.GAN[ganIndex + 1];
}
/**
* 获取干支(时柱)
*
* @return 干支(时柱)
*/
public String getGanZhi() {
return getGan() + getZhi();
}
/**
* 获取喜神方位
*
* @return 喜神方位,如艮
*/
public String getPositionXi() {
return LunarUtil.POSITION_XI[ganIndex + 1];
}
/**
* 获取喜神方位描述
*
* @return 喜神方位描述,如东北
*/
public String getPositionXiDesc() {
return LunarUtil.POSITION_DESC.get(getPositionXi());
}
/**
* 获取阳贵神方位
*
* @return 阳贵神方位,如艮
*/
public String getPositionYangGui() {
return LunarUtil.POSITION_YANG_GUI[ganIndex + 1];
}
/**
* 获取阳贵神方位描述
*
* @return 阳贵神方位描述,如东北
*/
public String getPositionYangGuiDesc() {
return LunarUtil.POSITION_DESC.get(getPositionYangGui());
}
/**
* 获取阴贵神方位
*
* @return 阴贵神方位,如艮
*/
public String getPositionYinGui() {
return LunarUtil.POSITION_YIN_GUI[ganIndex + 1];
}
/**
* 获取阴贵神方位描述
*
* @return 阴贵神方位描述,如东北
*/
public String getPositionYinGuiDesc() {
return LunarUtil.POSITION_DESC.get(getPositionYinGui());
}
/**
* 获取福神方位(默认流派:2)
*
* @return 福神方位,如艮
*/
public String getPositionFu() {
return getPositionFu(2);
}
/**
* 获取福神方位
*
* @param sect 流派,1或2
* @return 福神方位,如艮
*/
public String getPositionFu(int sect) {
return (1 == sect ? LunarUtil.POSITION_FU : LunarUtil.POSITION_FU_2)[ganIndex + 1];
}
/**
* 获取福神方位描述(默认流派:2)
*
* @return 福神方位描述,如东北
*/
public String getPositionFuDesc() {
return getPositionFuDesc(2);
}
/**
* 获取福神方位描述
*
* @param sect 流派,1或2
* @return 福神方位描述,如东北
*/
public String getPositionFuDesc(int sect) {
return LunarUtil.POSITION_DESC.get(getPositionFu(sect));
}
/**
* 获取财神方位
*
* @return 财神方位,如艮
*/
public String getPositionCai() {
return LunarUtil.POSITION_CAI[ganIndex + 1];
}
/**
* 获取财神方位描述
*
* @return 财神方位描述,如东北
*/
public String getPositionCaiDesc() {
return LunarUtil.POSITION_DESC.get(getPositionCai());
}
/**
* 获取纳音
*
* @return 纳音,如剑锋金
*/
public String getNaYin() {
return LunarUtil.NAYIN.get(getGanZhi());
}
/**
* 获取值时天神
*
* @return 值时天神
*/
public String getTianShen() {
String dayZhi = lunar.getDayZhiExact();
int offset = LunarUtil.ZHI_TIAN_SHEN_OFFSET.get(dayZhi);
return LunarUtil.TIAN_SHEN[(zhiIndex + offset) % 12 + 1];
}
/**
* 获取值时天神类型:黄道/黑道
*
* @return 值时天神类型:黄道/黑道
*/
public String getTianShenType() {
return LunarUtil.TIAN_SHEN_TYPE.get(getTianShen());
}
/**
* 获取值时天神吉凶
*
* @return 吉/凶
*/
public String getTianShenLuck() {
return LunarUtil.TIAN_SHEN_TYPE_LUCK.get(getTianShenType());
}
/**
* 获取时冲
*
* @return 时冲,如申
*/
public String getChong() {
return LunarUtil.CHONG[zhiIndex];
}
/**
* 获取时煞
*
* @return 时煞,如北
*/
public String getSha() {
return LunarUtil.SHA.get(getZhi());
}
/**
* 获取时冲生肖
*
* @return 时冲生肖,如猴
*/
public String getChongShengXiao() {
String chong = getChong();
for (int i = 0, j = LunarUtil.ZHI.length; i < j; i++) {
if (LunarUtil.ZHI[i].equals(chong)) {
return LunarUtil.SHENGXIAO[i];
}
}
return "";
}
/**
* 获取时冲描述
*
* @return 时冲描述,如(壬申)猴
*/
public String getChongDesc() {
return "(" + getChongGan() + getChong() + ")" + getChongShengXiao();
}
/**
* 获取无情之克的时冲天干
*
* @return 无情之克的时冲天干,如甲
*/
public String getChongGan() {
return LunarUtil.CHONG_GAN[ganIndex];
}
/**
* 获取有情之克的时冲天干
*
* @return 有情之克的时冲天干,如甲
*/
public String getChongGanTie() {
return LunarUtil.CHONG_GAN_TIE[ganIndex];
}
/**
* 获取宜,如果没有,返回["无"]
*
* @return 宜
*/
public List<String> getYi() {
return LunarUtil.getTimeYi(lunar.getDayInGanZhiExact(), getGanZhi());
}
/**
* 获取忌,如果没有,返回["无"]
*
* @return 忌
*/
public List<String> getJi() {
return LunarUtil.getTimeJi(lunar.getDayInGanZhiExact(), getGanZhi());
}
/**
* 获取值时九星(时家紫白星歌诀:三元时白最为佳,冬至阳生顺莫差,孟日七宫仲一白,季日四绿发萌芽,每把时辰起甲子,本时星耀照光华,时星移入中宫去,顺飞八方逐细查。夏至阴生逆回首,孟归三碧季加六,仲在九宫时起甲,依然掌中逆轮跨。)
*
* @return 值时九星
*/
public NineStar getNineStar() {
//顺逆
String solarYmd = lunar.getSolar().toYmd();
Map<String, Solar> jieQi = lunar.getJieQiTable();
boolean asc = solarYmd.compareTo(jieQi.get("冬至").toYmd()) >= 0 && solarYmd.compareTo(jieQi.get("夏至").toYmd()) < 0;
int start = asc ? 7 : 3;
String dayZhi = lunar.getDayZhi();
if ("子午卯酉".contains(dayZhi)) {
start = asc ? 1 : 9;
} else if ("辰戌丑未".contains(dayZhi)) {
start = asc ? 4 : 6;
}
int index = asc ? start + zhiIndex - 1 : start - zhiIndex - 1;
if (index > 8) {
index -= 9;
}
if (index < 0) {
index += 9;
}
return new NineStar(index);
}
/**
* 获取所在旬
*
* @return 旬
*/
public String getXun() {
return LunarUtil.getXun(getGanZhi());
}
/**
* 获取值时空亡
*
* @return 空亡(旬空)
*/
public String getXunKong() {
return LunarUtil.getXunKong(getGanZhi());
}
/**
* 获取当前时辰的最早时分
*
* @return 时分,如:21:00
*/
public String getMinHm() {
int hour = lunar.getHour();
if (hour < 1) {
return "00:00";
} else if (hour > 22) {
return "23:00";
}
return String.format("%02d:00", hour % 2 == 0 ? hour - 1 : hour);
}
/**
* 获取当前时辰的最晚时分
*
* @return 时分,如:22:59
*/
public String getMaxHm() {
int hour = lunar.getHour();
if (hour < 1) {
return "00:59";
} else if (hour > 22) {
return "23:59";
}
return String.format("%02d:59", hour % 2 == 0 ? hour : hour + 1);
}
@Override
public String toString() {
return getGanZhi();
}
}