/// <summary> /// 计算节气表(冬至的太阳黄经是-90度或270度) /// </summary> private void computeJieQi() { //儒略日,冬至在阳历上一年,所以这里多减1年以从去年开始 double jd = 365.2422 * (solar.getYear() - 2001); for (int i = 0, j = JIE_QI.Length; i < j; i++) { double t = calJieQi(jd + i * 15.2, i * 15 - 90) + Solar.J2000 + 8D / 24; jieQi.Add(JIE_QI[i], Solar.fromJulianDay(t)); } }
/// <summary> /// 获取气 /// </summary> /// <returns>气</returns> public string getQi() { foreach (string qi in LunarUtil.QI) { Solar d = jieQi[qi]; if (d.getYear() == solar.getYear() && d.getMonth() == solar.getMonth() && d.getDay() == solar.getDay()) { return(qi); } } return(""); }
/// <summary> /// 获取节 /// </summary> /// <returns>节</returns> public string getJie() { foreach (string jie in LunarUtil.JIE) { Solar d = jieQi[jie]; if (d.getYear() == solar.getYear() && d.getMonth() == solar.getMonth() && d.getDay() == solar.getDay()) { return(jie); } } return(""); }
/// <summary> /// 周推移 /// </summary> /// <param name="weeks">推移的周数,负数为倒推</param> /// <param name="separateMonth">是否按月单独计算</param> /// <returns>推移后的阳历周</returns> public SolarWeek next(int weeks, bool separateMonth) { if (0 == weeks) { return(new SolarWeek(year, month, day, start)); } if (separateMonth) { int n = weeks; DateTime c = new DateTime(year, month, day); SolarWeek week = new SolarWeek(c, start); int m = this.month; bool plus = n > 0; while (0 != n) { c = c.AddDays(plus ? 7 : -7); week = new SolarWeek(c, start); int weekMonth = week.getMonth(); if (m != weekMonth) { int index = week.getIndex(); if (plus) { if (1 == index) { Solar firstDay = week.getFirstDay(); week = new SolarWeek(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), start); weekMonth = week.getMonth(); } else { c = new DateTime(week.getYear(), week.getMonth(), 1); week = new SolarWeek(c, start); } } else { int size = SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), start); if (size == index) { Solar firstDay = week.getFirstDay(); Solar lastDay = firstDay.next(6); week = new SolarWeek(lastDay.getYear(), lastDay.getMonth(), lastDay.getDay(), start); weekMonth = week.getMonth(); } else { c = new DateTime(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth())); week = new SolarWeek(c, start); } } m = weekMonth; } n -= plus ? 1 : -1; } return(week); } else { DateTime c = new DateTime(year, month, day); c = c.AddDays(weeks * 7); return(new SolarWeek(c, start)); } }
/// <summary> /// 通过阳历日期初始化 /// </summary> /// <param name="date">阳历日期</param> public Lunar(DateTime date) { solar = new Solar(date); int y = solar.getYear(); int m = solar.getMonth(); int d = solar.getDay(); int startYear, startMonth, startDay; int lunarYear, lunarMonth, lunarDay; if (y < 2000) { startYear = SolarUtil.BASE_YEAR; startMonth = SolarUtil.BASE_MONTH; startDay = SolarUtil.BASE_DAY; lunarYear = LunarUtil.BASE_YEAR; lunarMonth = LunarUtil.BASE_MONTH; lunarDay = LunarUtil.BASE_DAY; } else { startYear = SolarUtil.BASE_YEAR + 99; startMonth = 1; startDay = 1; lunarYear = LunarUtil.BASE_YEAR + 99; lunarMonth = 11; lunarDay = 25; } int diff = 0; for (int i = startYear; i < y; i++) { diff += 365; if (SolarUtil.isLeapYear(i)) { diff += 1; } } for (int i = startMonth; i < m; i++) { diff += SolarUtil.getDaysOfMonth(y, i); } diff += d - startDay; lunarDay += diff; int lastDate = LunarUtil.getDaysOfMonth(lunarYear, lunarMonth); while (lunarDay > lastDate) { lunarDay -= lastDate; lunarMonth = LunarUtil.nextMonth(lunarYear, lunarMonth); if (lunarMonth == 1) { lunarYear++; } lastDate = LunarUtil.getDaysOfMonth(lunarYear, lunarMonth); } year = lunarYear; month = lunarMonth; day = lunarDay; hour = solar.getHour(); minute = solar.getMinute(); second = solar.getSecond(); dayOffset = LunarUtil.computeAddDays(year, month, day); compute(); }
/// <summary> /// 通过八字获取阳历列表 /// </summary> /// <param name="yearGanZhi">年柱</param> /// <param name="monthGanZhi">月柱</param> /// <param name="dayGanZhi">日柱</param> /// <param name="timeGanZhi">时柱</param> /// <returns>符合的阳历列表</returns> public static List <Solar> fromBaZi(string yearGanZhi, string monthGanZhi, string dayGanZhi, string timeGanZhi) { List <Solar> l = new List <Solar>(); Solar today = new Solar(); Lunar lunar = today.getLunar(); int offsetYear = LunarUtil.getJiaZiIndex(lunar.getYearInGanZhiExact()) - LunarUtil.getJiaZiIndex(yearGanZhi); if (offsetYear < 0) { offsetYear = offsetYear + 60; } int startYear = today.getYear() - offsetYear; int hour = 0; string timeZhi = timeGanZhi.Substring(1); for (int i = 0, j = LunarUtil.ZHI.Length; i < j; i++) { if (LunarUtil.ZHI[i].Equals(timeZhi)) { hour = (i - 1) * 2; } } while (startYear >= SolarUtil.BASE_YEAR - 1) { int year = startYear - 1; int counter = 0; int month = 12; int day; bool found = false; while (counter < 15) { if (year >= SolarUtil.BASE_YEAR) { day = 1; if (year == SolarUtil.BASE_YEAR && month == SolarUtil.BASE_MONTH) { day = SolarUtil.BASE_DAY; } Solar solar = Solar.fromYmdHms(year, month, day, hour, 0, 0); lunar = solar.getLunar(); if (lunar.getYearInGanZhiExact().Equals(yearGanZhi) && lunar.getMonthInGanZhiExact().Equals(monthGanZhi)) { found = true; break; } } month++; if (month > 12) { month = 1; year++; } counter++; } if (found) { counter = 0; month--; if (month < 1) { month = 12; year--; } day = 1; if (year == SolarUtil.BASE_YEAR && month == SolarUtil.BASE_MONTH) { day = SolarUtil.BASE_DAY; } Solar solar = Solar.fromYmdHms(year, month, day, hour, 0, 0); while (counter < 61) { lunar = solar.getLunar(); if (lunar.getYearInGanZhiExact().Equals(yearGanZhi) && lunar.getMonthInGanZhiExact().Equals(monthGanZhi) && lunar.getDayInGanZhiExact().Equals(dayGanZhi) && lunar.getTimeInGanZhi().Equals(timeGanZhi)) { l.Add(solar); break; } solar = solar.next(1); counter++; } } startYear -= 60; } return(l); }