migration: establish exact preserved app baseline
This commit is contained in:
Vendored
+162
@@ -0,0 +1,162 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from math import ceil
|
||||
|
||||
from . import Solar
|
||||
from .util import SolarUtil
|
||||
|
||||
|
||||
class SolarWeek:
|
||||
"""
|
||||
阳历周
|
||||
"""
|
||||
|
||||
def __init__(self, year, month, day, start):
|
||||
"""
|
||||
通过年月日初始化
|
||||
:param year: 年
|
||||
:param month: 月,1到12
|
||||
:param day: 日,1到31
|
||||
:param start: 星期几作为一周的开始,1234560分别代表星期一至星期天
|
||||
"""
|
||||
self.__year = year
|
||||
self.__month = month
|
||||
self.__day = day
|
||||
self.__start = start
|
||||
|
||||
@staticmethod
|
||||
def fromDate(date, start):
|
||||
return SolarWeek(date.year, date.month, date.day, start)
|
||||
|
||||
@staticmethod
|
||||
def fromYmd(year, month, day, start):
|
||||
return SolarWeek(year, month, day, start)
|
||||
|
||||
def getYear(self):
|
||||
return self.__year
|
||||
|
||||
def getMonth(self):
|
||||
return self.__month
|
||||
|
||||
def getDay(self):
|
||||
return self.__day
|
||||
|
||||
def getStart(self):
|
||||
return self.__start
|
||||
|
||||
def toString(self):
|
||||
return "%d.%d.%d" % (self.__year, self.__month, self.getIndex())
|
||||
|
||||
def toFullString(self):
|
||||
return "%d年%d月第%d周" % (self.__year, self.__month, self.getIndex())
|
||||
|
||||
def __str__(self):
|
||||
return self.toString()
|
||||
|
||||
def getIndex(self):
|
||||
"""
|
||||
获取当前日期是在当月第几周
|
||||
:return: 周序号,从1开始
|
||||
"""
|
||||
offset = Solar.fromYmd(self.__year, self.__month, 1).getWeek() - self.__start
|
||||
if offset < 0:
|
||||
offset += 7
|
||||
return int(ceil((self.__day + offset) * 1.0 / 7))
|
||||
|
||||
def getIndexInYear(self):
|
||||
"""
|
||||
获取当前日期是在当年第几周
|
||||
:return: 周序号,从1开始
|
||||
"""
|
||||
offset = Solar.fromYmd(self.__year, 1, 1).getWeek() - self.__start
|
||||
if offset < 0:
|
||||
offset += 7
|
||||
return int(ceil((SolarUtil.getDaysInYear(self.__year, self.__month, self.__day) + offset) * 1.0 / 7))
|
||||
|
||||
def getFirstDay(self):
|
||||
"""
|
||||
获取本周第一天的阳历日期(可能跨月)
|
||||
:return: 本周第一天的阳历日期
|
||||
"""
|
||||
solar = Solar.fromYmd(self.__year, self.__month, self.__day)
|
||||
prev = solar.getWeek() - self.__start
|
||||
if prev < 0:
|
||||
prev += 7
|
||||
return solar.next(-prev)
|
||||
|
||||
def getFirstDayInMonth(self):
|
||||
"""
|
||||
获取本周第一天的阳历日期(仅限当月)
|
||||
:return: 本周第一天的阳历日期
|
||||
"""
|
||||
for day in self.getDays():
|
||||
if self.__month == day.getMonth():
|
||||
return day
|
||||
return None
|
||||
|
||||
def getDays(self):
|
||||
"""
|
||||
获取本周的阳历日期列表(可能跨月)
|
||||
:return: 本周的阳历日期列表
|
||||
"""
|
||||
days = []
|
||||
first = self.getFirstDay()
|
||||
days.append(first)
|
||||
for i in range(1, 7):
|
||||
days.append(first.next(i))
|
||||
return days
|
||||
|
||||
def getDaysInMonth(self):
|
||||
"""
|
||||
获取本周的阳历日期列表(仅限当月)
|
||||
:return: 本周的阳历日期列表(仅限当月)
|
||||
"""
|
||||
days = []
|
||||
for day in self.getDays():
|
||||
if self.__month == day.getMonth():
|
||||
days.append(day)
|
||||
return days
|
||||
|
||||
def next(self, weeks, separate_month):
|
||||
"""
|
||||
周推移
|
||||
:param weeks: 推移的周数,负数为倒推
|
||||
:param separate_month: 是否按月单独计算
|
||||
:return: 推移后的阳历周
|
||||
"""
|
||||
if 0 == weeks:
|
||||
return SolarWeek.fromYmd(self.__year, self.__month, self.__day, self.__start)
|
||||
solar = Solar.fromYmd(self.__year, self.__month, self.__day)
|
||||
if separate_month:
|
||||
n = weeks
|
||||
week = SolarWeek.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), self.__start)
|
||||
month = self.__month
|
||||
plus = n > 0
|
||||
days = 7 if plus else -7
|
||||
while 0 != n:
|
||||
solar = solar.next(days)
|
||||
week = SolarWeek.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), self.__start)
|
||||
week_month = week.getMonth()
|
||||
if month != week_month:
|
||||
index = week.getIndex()
|
||||
if plus:
|
||||
if 1 == index:
|
||||
first_day = week.getFirstDay()
|
||||
week = SolarWeek.fromYmd(first_day.getYear(), first_day.getMonth(), first_day.getDay(), self.__start)
|
||||
week_month = week.getMonth()
|
||||
else:
|
||||
solar = Solar.fromYmd(week.getYear(), week.getMonth(), 1)
|
||||
week = SolarWeek.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), self.__start)
|
||||
else:
|
||||
if SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), self.__start) == index:
|
||||
last_day = week.getFirstDay().next(6)
|
||||
week = SolarWeek.fromYmd(last_day.getYear(), last_day.getMonth(), last_day.getDay(), self.__start)
|
||||
week_month = week.getMonth()
|
||||
else:
|
||||
solar = Solar.fromYmd(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth()))
|
||||
week = SolarWeek.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), self.__start)
|
||||
month = week_month
|
||||
n -= 1 if plus else -1
|
||||
return week
|
||||
else:
|
||||
solar = solar.next(weeks * 7)
|
||||
return SolarWeek.fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), self.__start)
|
||||
Reference in New Issue
Block a user