163 lines
5.6 KiB
Python
163 lines
5.6 KiB
Python
# -*- 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)
|