/// <summary> /// 用八字寻找公历时间。 /// </summary> /// <param name="year">年干支</param> /// <param name="month">月干支</param> /// <param name="day">日干支</param> /// <param name="startYear">开始时间</param> /// <param name="forward">方向: -1 往以前日子, 1 往后面的日子</param> /// <returns></returns> public static DateTime 查找八字(string year, string month, string day, int startYear, 方向 forward) { // 看年月是否匹配 GanZhi n = new GanZhi(year); GanZhi m = new GanZhi(month); if (n.Gan.起月时(m.Zhi, 柱位.月) != m) { throw new ArgumentException($"'{year}'年不存在'{month}'月。"); } // 开始运算 int yearDiff = CalcYearDiff(new GanZhi(year), startYear, forward); int monthIndex = m.Zhi.Index == 0 ? 12 : m.Zhi.Index; startYear += m.Zhi.Index == 1 ? 1 : 0; // 上下搜索600年 for (int periode = 0; periode < 10; periode++) { int f = forward == 方向.顺行 ? 1 : -1; LnDate lndate = new LnDate(startYear + yearDiff + f * 60 * periode, monthIndex, 1); while (lndate.JieQiTime == TimeSpan.Zero) { lndate = lndate.Add(1); } if (lndate.YearGZ != year || lndate.MonthGZ != month) { throw new Exception("计算思路有错误!"); } while (lndate.MonthGZ == month) { if (lndate.DayGZ == day) { return(lndate.datetime); } lndate = lndate.Add(1); } } throw new Exception("六百年内找不到结果!"); }
public static DateTime 查找农历(int year, string yue, string day, bool leap = false) { LnDate lndate = new LnDate(year, 1, 1); while (lndate.Year == year) { if (lndate.MonthNL == yue && lndate.DayNL == day && string.IsNullOrEmpty(lndate.Leap) != leap) { return(lndate.datetime); } lndate = lndate.Add(1); } throw new Exception("找不到结果!"); }