174 lines
5.3 KiB
Python
174 lines
5.3 KiB
Python
# -*- 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]
|