migration: establish exact preserved app baseline
This commit is contained in:
Vendored
+173
@@ -0,0 +1,173 @@
|
||||
# -*- 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]
|
||||
Reference in New Issue
Block a user