Python datetime 模块之获取某年某月的第 n 天(第 n 个星期 w)和倒数第 n 天(倒数第 n 个星期 w)的日期

____tz_zs

获取某年某月的第n天和倒数第n天的日期

例如:
获取2019年6月的第一天和最后一天
获取2019年6月的第2天和倒数第2天

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import calendar
from datetime import datetime


def get_month_firstday_and_lastday(year, month, n=1):
    """
    获取 year 年,month 月 的第n天和倒数第n天的日期
    :param year: 指定年份,如 2019
    :param month: 指定月份,如 6
    :param n:
    :return: 第n天,倒数第n天
    """
    weekday, count_day = calendar.monthrange(year=year, month=month)  # 返回指定月份第一天(即1号)的星期日期,和本月的总天数【日历模块 calendar https://blog.csdn.net/tz_zs/article/details/86629959】
    # 获取指定月的第一天和最后一天
    first_day = datetime(year=year, month=month, day=n)  # <type 'datetime.datetime'>
    last_day = datetime(year=year, month=month, day=count_day - (n - 1))
    # print(first_day)
    # print(last_day)
    # print(first_day.date())
    # print(last_day.date())
    return first_day, last_day


# 获取2019年6月的第一天和最后一天
first_day, last_day = get_month_firstday_and_lastday(year=2019, month=6, n=1)
print(first_day.date())  # 2019-06-01
print(last_day.date())  # 2019-06-30
# 获取2019年6月的第2天和倒数第2天
first_day, last_day = get_month_firstday_and_lastday(year=2019, month=6, n=2)
print(first_day.date())  # 2019-06-02
print(last_day.date())  # 2019-06-29

获取某年某月的第n个星期w和倒数第n个星期w的日期

例如:
获取2019年6月的第一个和最后一个星期五
获取2019年6月的第2个和倒数第2个星期五

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import calendar
from datetime import datetime
from datetime import timedelta

def get_weekday(datetime_obj, week_day="monday"):
    """
    获取指定时间的当周的星期x
    :param datetime_obj: 时间
    :param week_day: 指定的星期x
    :return:
    """
    d = dict(zip(("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"), range(7)))  # datetime 模块中,星期一到星期天对应数字 0 到 6
    delta_hour = timedelta(days=1)  # 改变幅度为 1 天
    while datetime_obj.weekday() != d.get(week_day):
        if datetime_obj.weekday() > d.get(week_day):
            datetime_obj -= delta_hour
        elif datetime_obj.weekday() < d.get(week_day):
            datetime_obj += delta_hour
        else:
            pass
    return datetime_obj


def get_first_and_last_weekday(year, month, n=1, w="monday"):
    """
    获取 year 年,month 月 的第n个星期w和倒数第n个星期w的日期
    :param year: 指定年份,如 2019
    :param month: 指定月份,如 6
    :param n: 第n个
    :param w: 指定的星期w
    :return:
    """
    # 获取第一和最后一天
    d = dict(zip(("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"), range(7)))  # datetime 模块中,星期一到星期天对应数字 0 到 6
    weekday, count_day = calendar.monthrange(year=year, month=month)  # 返回指定月份第一天(即1号)的星期日期,和本月的总天数 https://blog.csdn.net/tz_zs/article/details/86629959
    first_day = datetime(year=year, month=month, day=1)  # <type 'datetime.datetime'>
    last_day = datetime(year=year, month=month, day=count_day)
    # first_day, last_day = get_month_firstday_and_lastday(year=year, month=month, n=1)

    # 第1个星期w
    if first_day.weekday() > d.get(w):  # 说明本周的星期w在上个月
        datetime_obj = first_day + timedelta(weeks=1)
    else:
        datetime_obj = first_day
    datetime_obj += timedelta(weeks=n - 1)
    first_weekday = get_weekday(datetime_obj=datetime_obj, week_day=w)

    # 倒数第1个星期w
    if last_day.weekday() < d.get(w):  # 说明本周的星期w在下一个月
        datetime_obj = last_day - timedelta(weeks=1)
    else:
        datetime_obj = last_day
    datetime_obj -= timedelta(weeks=n - 1)
    last_weekday = get_weekday(datetime_obj=datetime_obj, week_day=w)

    return first_weekday, last_weekday


# 获取2019年6月的第一个和最后一个星期五
first_weekday, last_weekday = get_first_and_last_weekday(year=2019, month=6, n=1, w="friday")
print(first_weekday.date())  # 2019-06-07
print(last_weekday.date())  # 2019-06-28

# 获取2019年6月的第2个和倒数第2个星期五
first_weekday, last_weekday = get_first_and_last_weekday(year=2019, month=6, n=2, w="friday")
print(first_weekday.date())  # 2019-06-14
print(last_weekday.date())  # 2019-06-21

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值