# -*- coding: utf-8 -*- from . import Solar, LunarYear, NineStar from .util import LunarUtil class LunarMonth: """ 农历月 """ def __init__(self, lunar_year, lunar_month, day_count, first_julian_day, index): self.__year = lunar_year self.__month = lunar_month self.__dayCount = day_count self.__firstJulianDay = first_julian_day self.__index = index self.__zhiIndex = (abs(lunar_month) - 1 + LunarUtil.BASE_MONTH_ZHI_INDEX) % 12 @staticmethod def fromYm(lunar_year, lunar_month): from . import LunarYear return LunarYear.fromYear(lunar_year).getMonth(lunar_month) def getYear(self): return self.__year def getMonth(self): return self.__month def getIndex(self): return self.__index def getZhiIndex(self): return self.__zhiIndex def getGanIndex(self): offset = (LunarYear.fromYear(self.__year).getGanIndex() + 1) % 5 * 2 return (abs(self.__month) - 1 + offset) % 10 def getGan(self): return LunarUtil.GAN[self.getGanIndex() + 1] def getZhi(self): return LunarUtil.ZHI[self.getZhiIndex() + 1] def getGanZhi(self): return "%s%s" % (self.getGan(), self.getZhi()) def getPositionXi(self): return LunarUtil.POSITION_XI[self.getGanIndex() + 1] def getPositionXiDesc(self): return LunarUtil.POSITION_DESC[self.getPositionXi()] def getPositionYangGui(self): return LunarUtil.POSITION_YANG_GUI[self.getGanIndex() + 1] def getPositionYangGuiDesc(self): return LunarUtil.POSITION_DESC[self.getPositionYangGui()] def getPositionYinGui(self): return LunarUtil.POSITION_YIN_GUI[self.getGanIndex() + 1] def getPositionYinGuiDesc(self): return LunarUtil.POSITION_DESC[self.getPositionYinGui()] def getPositionFu(self, sect=2): return (LunarUtil.POSITION_FU if 1 == sect else LunarUtil.POSITION_FU_2)[self.getGanIndex() + 1] def getPositionFuDesc(self, sect=2): return LunarUtil.POSITION_DESC[self.getPositionFu(sect)] def getPositionCai(self): return LunarUtil.POSITION_CAI[self.getGanIndex() + 1] def getPositionCaiDesc(self): return LunarUtil.POSITION_DESC[self.getPositionCai()] def isLeap(self): return self.__month < 0 def getDayCount(self): return self.__dayCount def getFirstJulianDay(self): return self.__firstJulianDay def getPositionTaiSui(self): m = abs(self.__month) % 4 if 0 == m: p = "巽" elif 1 == m: p = "艮" elif 3 == m: p = "坤" else: p = LunarUtil.POSITION_GAN[Solar.fromJulianDay(self.getFirstJulianDay()).getLunar().getMonthGanIndex()] return p def getPositionTaiSuiDesc(self): return LunarUtil.POSITION_DESC[self.getPositionTaiSui()] def getNineStar(self): index = LunarYear.fromYear(self.__year).getZhiIndex() % 3 m = abs(self.__month) month_zhi_index = (13 + m) % 12 n = 27 - (index * 3) if month_zhi_index < LunarUtil.BASE_MONTH_ZHI_INDEX: n -= 3 offset = (n - month_zhi_index) % 9 return NineStar.fromIndex(offset) def toString(self): return "%d年%s%s月(%d天)" % (self.__year, ("闰" if self.isLeap() else ""), LunarUtil.MONTH[abs(self.__month)], self.__dayCount) def __str__(self): return self.toString() def next(self, n): """ 获取往后推几个月的阴历月,如果要往前推,则月数用负数 :param n: 月数 :return: 阴历月 """ if 0 == n: return LunarMonth.fromYm(self.__year, self.__month) elif n > 0: rest = n ny = self.__year iy = ny im = self.__month index = 0 months = LunarYear.fromYear(ny).getMonths() while True: size = len(months) for i in range(0, size): m = months[i] if m.getYear() == iy and m.getMonth() == im: index = i break more = size - index - 1 if rest < more: break rest -= more last_month = months[size - 1] iy = last_month.getYear() im = last_month.getMonth() ny += 1 months = LunarYear.fromYear(ny).getMonths() return months[index + rest] else: rest = -n ny = self.__year iy = ny im = self.__month index = 0 months = LunarYear.fromYear(ny).getMonths() while True: size = len(months) for i in range(0, size): m = months[i] if m.getYear() == iy and m.getMonth() == im: index = i break if rest <= index: break rest -= index first_month = months[0] iy = first_month.getYear() im = first_month.getMonth() ny -= 1 months = LunarYear.fromYear(ny).getMonths() return months[index - rest]