/// <summary> /// 计算干支纪年 /// </summary> private void computeYear() { yearGanIndex = (year + LunarUtil.BASE_YEAR_GANZHI_INDEX) % 10; yearZhiIndex = (year + LunarUtil.BASE_YEAR_GANZHI_INDEX) % 12; //以立春作为新一年的开始的干支纪年 int g = yearGanIndex; int z = yearZhiIndex; //精确的干支纪年,以立春交接时刻为准 int gExact = yearGanIndex; int zExact = yearZhiIndex; if (year == solar.getYear()) { //获取立春的阳历时刻 Solar liChun = jieQi["立春"]; //立春日期判断 if (solar.toYmd().CompareTo(liChun.toYmd()) < 0) { g--; if (g < 0) { g += 10; } z--; if (z < 0) { z += 12; } } //立春交接时刻判断 if (solar.toYmdhms().CompareTo(liChun.toYmdhms()) < 0) { gExact--; if (gExact < 0) { gExact += 10; } zExact--; if (zExact < 0) { zExact += 12; } } } yearGanIndexByLiChun = g; yearZhiIndexByLiChun = z; yearGanIndexExact = gExact; yearZhiIndexExact = zExact; }
/** * 干支纪月计算 */ private void computeMonth() { Solar start = null; Solar end; //干偏移值(以立春当天起算) int gOffset = ((yearGanIndexByLiChun % 5 + 1) * 2) % 10; //干偏移值(以立春交接时刻起算) int gOffsetExact = ((yearGanIndexExact % 5 + 1) * 2) % 10; //序号:大雪到小寒之间-2,小寒到立春之间-1,立春之后0 int index = -2; foreach (string jie in LunarUtil.JIE) { end = jieQi[jie]; string ymd = solar.toYmd(); string symd = null == start ? ymd : start.toYmd(); string eymd = end.toYmd(); if (ymd.CompareTo(symd) >= 0 && ymd.CompareTo(eymd) < 0) { break; } start = end; index++; } if (index < 0) { index += 12; } monthGanIndex = (index + gOffset) % 10; monthZhiIndex = (index + LunarUtil.BASE_MONTH_ZHI_INDEX) % 12; //序号:大雪到小寒之间-2,小寒到立春之间-1,立春之后0 int indexExact = -2; foreach (string jie in LunarUtil.JIE) { end = jieQi[jie]; string time = solar.toYmdhms(); string stime = null == start ? time : start.toYmdhms(); string etime = end.toYmdhms(); if (time.CompareTo(stime) >= 0 && time.CompareTo(etime) < 0) { break; } start = end; indexExact++; } if (indexExact < 0) { indexExact += 12; } monthGanIndexExact = (indexExact + gOffsetExact) % 10; monthZhiIndexExact = (indexExact + LunarUtil.BASE_MONTH_ZHI_INDEX) % 12; }