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";
}
}
}
}