using System; using System.Collections.Generic; using Lunar.Util; // ReSharper disable MemberCanBePrivate.Global // ReSharper disable IdentifierTypo namespace Lunar { /// /// 时辰 /// public class LunarTime { /// /// 天干下标,0-9 /// public int GanIndex { get; } /// /// 地支下标,0-11 /// public int ZhiIndex { get; } /// /// 阴历 /// public Lunar Lunar { get; } /// /// 通过农历年月日时初始化 /// /// 年(农历) /// 月(农历),1到12,闰月为负,即闰2月=-2 /// 日(农历),1到31 /// 小时(阳历) /// 分钟(阳历) /// 秒钟(阳历) public LunarTime(int lunarYear, int lunarMonth, int lunarDay, int hour, int minute, int second) { Lunar = Lunar.FromYmdHms(lunarYear, lunarMonth, lunarDay, hour, minute, second); ZhiIndex = LunarUtil.GetTimeZhiIndex((hour < 10 ? "0" : "") + hour + ":" + (minute < 10 ? "0" : "") + minute); GanIndex = (Lunar.DayGanIndexExact % 5 * 2 + ZhiIndex) % 10; } /// /// 通过指定农历年月日获取时辰 /// /// 年(农历) /// 月(农历),1到12,闰月为负,即闰2月=-2 /// 日(农历),1到31 /// 小时(阳历) /// 分钟(阳历) /// 秒钟(阳历) /// 时辰 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 string ShengXiao => LunarUtil.SHENGXIAO[ZhiIndex + 1]; /// /// 地支 /// public string Zhi => LunarUtil.ZHI[ZhiIndex + 1]; /// /// 天干 /// public string Gan => LunarUtil.GAN[GanIndex + 1]; /// /// 干支(时柱) /// public string GanZhi => $"{Gan}{Zhi}"; /// /// 喜神方位,如艮 /// public string PositionXi => LunarUtil.POSITION_XI[GanIndex + 1]; /// /// 喜神方位描述,如东北 /// public string PositionXiDesc => LunarUtil.POSITION_DESC[PositionXi]; /// /// 阳贵神方位,如艮 /// public string PositionYangGui => LunarUtil.POSITION_YANG_GUI[GanIndex + 1]; /// /// 阳贵神方位描述,如东北 /// public string PositionYangGuiDesc => LunarUtil.POSITION_DESC[PositionYangGui]; /// /// 阴贵神方位,如艮 /// public string PositionYinGui => LunarUtil.POSITION_YIN_GUI[GanIndex + 1]; /// /// 阴贵神方位描述,如东北 /// public string PositionYinGuiDesc => LunarUtil.POSITION_DESC[PositionYinGui]; /// /// 福神方位(流派2),如艮 /// public string PositionFu => GetPositionFu(); /// /// 获取福神方位 /// /// 流派,可选1或2 /// 福神方位,如艮 public string GetPositionFu(int sect = 2) { return (1 == sect ? LunarUtil.POSITION_FU : LunarUtil.POSITION_FU_2)[GanIndex + 1]; } /// /// 福神方位描述(流派2),如东北 /// public string PositionFuDesc => GetPositionFuDesc(); /// /// 获取福神方位描述 /// /// 流派,可选1或2 /// 福神方位描述,如东北 public string GetPositionFuDesc(int sect = 2) { return LunarUtil.POSITION_DESC[GetPositionFu(sect)]; } /// /// 财神方位,如艮 /// public string PositionCai => LunarUtil.POSITION_CAI[GanIndex + 1]; /// /// 财神方位描述,如东北 /// /// 描述 public string PositionCaiDesc => LunarUtil.POSITION_DESC[PositionCai]; /// /// 冲,如申 /// /// 描述 public string Chong => LunarUtil.CHONG[ZhiIndex]; /// /// 无情之克的冲天干,如甲 /// public string ChongGan => LunarUtil.CHONG_GAN[GanIndex]; /// /// 有情之克的冲天干,如甲 /// public string ChongGanTie => LunarUtil.CHONG_GAN_TIE[GanIndex]; /// /// 冲生肖,如猴 /// public string ChongShengXiao { get { for (int i = 0, j = LunarUtil.ZHI.Length; i < j; i++) { if (LunarUtil.ZHI[i].Equals(Chong)) { return LunarUtil.SHENGXIAO[i]; } } return ""; } } /// /// 冲描述,如(壬申)猴 /// public string ChongDesc => "(" + ChongGan + Chong + ")" + ChongShengXiao; /// /// 煞,如北 /// public string Sha => LunarUtil.SHA[Zhi]; /// /// 纳音,如剑锋金 /// public string NaYin => LunarUtil.NAYIN[GanZhi]; /// /// 天神 /// public string TianShen => LunarUtil.TIAN_SHEN[(ZhiIndex + LunarUtil.ZHI_TIAN_SHEN_OFFSET[Lunar.DayZhiExact]) % 12 + 1]; /// /// 天神类型:黄道/黑道 /// public string TianShenType => LunarUtil.TIAN_SHEN_TYPE[TianShen]; /// /// 天神吉凶:吉/凶 /// public string TianShenLuck => LunarUtil.TIAN_SHEN_TYPE_LUCK[TianShenType]; /// /// 宜,如果没有,返回["无"] /// public List Yi => LunarUtil.GetTimeYi(Lunar.DayInGanZhiExact, GanZhi); /// /// 忌,如果没有,返回["无"] /// public List Ji => LunarUtil.GetTimeJi(Lunar.DayInGanZhiExact, GanZhi); /// /// 九星(时家紫白星歌诀:三元时白最为佳,冬至阳生顺莫差,孟日七宫仲一白,季日四绿发萌芽,每把时辰起甲子,本时星耀照光华,时星移入中宫去,顺飞八方逐细查。夏至阴生逆回首,孟归三碧季加六,仲在九宫时起甲,依然掌中逆轮跨。) /// public NineStar NineStar { get { var solarYmd = Lunar.Solar.Ymd; var jieQi = Lunar.JieQiTable; // 顺逆 var asc = string.Compare(solarYmd, jieQi["冬至"].Ymd, StringComparison.Ordinal) >= 0 && string.Compare(solarYmd, jieQi["夏至"].Ymd, StringComparison.Ordinal) < 0; var start = asc ? 7 : 3; var dayZhi = Lunar.DayZhi; if ("子午卯酉".Contains(dayZhi)) { start = asc ? 1 : 9; } else if ("辰戌丑未".Contains(dayZhi)) { start = asc ? 4 : 6; } var index = asc ? start + ZhiIndex - 1 : start - ZhiIndex - 1; if (index > 8) { index -= 9; } if (index < 0) { index += 9; } return new NineStar(index); } } /// public override string ToString() { return GanZhi; } /// /// 旬 /// public string Xun => LunarUtil.GetXun(GanZhi); /// /// 空亡(旬空) /// public string XunKong => LunarUtil.GetXunKong(GanZhi); /// /// 当前时辰的最早时分,如:21:00 /// public string MinHm { get { var hour = Lunar.Hour; if (hour < 1) { return "00:00"; } if (hour > 22) { return "23:00"; } if (hour % 2 == 0) { hour -= 1; } return hour.ToString().PadLeft(2, '0') + ":00"; } } /// /// 当前时辰的最晚时分,如:22:59 /// public string MaxHm { get { var hour = Lunar.Hour; if (hour < 1) { return "00:59"; } if (hour > 22) { return "23:59"; } if (hour % 2 != 0) { hour += 1; } return hour.ToString().PadLeft(2, '0') + ":59"; } } } }