如果输入是年份+季度, 输出那一年的3,6,9,12月的最后一个星期一的日期
如果输入是年份+月度,输出是那一年每个月的第二个星期五的日期
------------------------------------------------------------------------------------------------------------------
思路:
最后一个星期一:
找出每个月的最后一天是星期几,然后减掉几天就是最后一个星期一了
第二个星期五:
找出每个月第一天是周几,找出和周五的距离 (周五减周几)
如果小于0, 说明这个礼拜的周五已经过了,要多等两周才到第二个周五. 那么这个距离+14天就是第二个周五.
如果大于等于0,说明这个礼拜的周五还没到或第一天就是周五, 下个礼拜的周五就是第二个周五,那么这个距离 + 7天就是第二个周五.
------------------------------------------------------------------------------------------------------------------
一些引用的时间函数:
- calendar.monthrange(<年份>,<月份>) # (first day of week, last day of month)
eg. a = calendar.monthrange(2023,4) # (5, 30)
# 星期一到星期天的day of week是0,1,2,3,4,5,6. 所以5就是星期六
# 2023年4月的最后一天是30号,所以是30
a[0] = 5
a[1] = 30
- datetime.date(<年>,<月>,<日>) # 年-月-日
eg. b = datetime.date(2023,4,30) # 2023-04-30
- <datetime>.weekday()
eg. c = b.weekday() # 6
- <datetime> + timedelta(days=<number of days>)
eg. c = b + timedelta(days=3) # 2023-05-03
----------------------------------------------------------------------------------
解答:
import calendar
import datetime
from datetime import timedelta
## if the contract type is Quarter(Q), return last Monday of Mar,Jun,Sep,Dec
## if Monthly(M), return 2nd Friday of that Month
def contract_day(T, type):
if type == "Q":
lastMondayList = []
for month in [3,6,9,12]:
lastday = calendar.monthrange(int(T),month)[1]
lastdate = datetime.date(T,month,lastday)
days = lastdate.weekday()
lastmonday = datetime.date(T,month,lastday-days)
lastMondayList.append(str(lastmonday))
print(lastMondayList)
elif type == "M":
for month in range(1,13):
firstday = calendar.monthrange(int(T),month)[0]
days = 4 - firstday
if days >= 0:
days = days + 7
secondFri = datetime.date(T,month,1) + timedelta(days=days)
else:
days = days + 14
secondFri = datetime.date(T,month,1) + timedelta(days=days)
print(secondFri)
else:
print("only Q or M")
contract_day(2023,"M")
#2023-01-13
#2023-02-10
#2023-03-10
#2023-04-14
#2023-05-12
#2023-06-09
#2023-07-14
#2023-08-11
#2023-09-08
#2023-10-13
#2023-11-10
#2023-12-08
contract_day(2023,"Q")
#['2023-03-27', '2023-06-26', '2023-09-25', '2023-12-25']