找出某月的最后一个周一or第二个星期五

如果输入是年份+季度, 输出那一年的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']

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值