美文网首页
Python3 - 计算当前月份的日期范围

Python3 - 计算当前月份的日期范围

作者: 惑也 | 来源:发表于2018-12-20 23:31 被阅读54次

    问题

    代码需要在当前月份中循环每一天,找到一个计算这个日期范围的高效方法。

    解决方案

    需要事先构造一个包含所有日期的列表。 可以先计算出开始日期和结束日期, 然后在迭代的时候使用 datetime.timedelta 对象递增这个日期变量即可。

    下面是一个接受任意 datetime 对象并返回一个由当前月份开始日和下个月开始日组成的元组对象。

    from datetime import datetime, date, timedelta
    import calendar
    
    def get_month_range(start_date=None):
        if start_date is None:
            start_date = date.today().replace(day=1)
        _, days_in_month = calendar.monthrange(start_date.year, start_date.month)
        end_date = start_date + timedelta(days=days_in_month)
        return (start_date, end_date)
    

    有了这个就可以很容易的在返回的日期范围上面做循环操作了:

    t_day = timedelta(days=1)
    first_day, last_day = get_month_range()
    while first_day < last_day:
        print(first_day)
        first_day += t_day
    
    2018-12-01
    2018-12-02
    2018-12-03
    2018-12-04
    2018-12-05
    2018-12-06
    2018-12-07
    2018-12-08
    #... and so on...
    

    讨论

    上面的代码先计算出一个月份的第一天的日期。 一个快速的方法就是使用 date 或 datetime 对象的 replace() 方法,简单的将 days 属性设置成1即可;

    然后,使用 calendar.monthrange() 函数来找出该月的总天数。 需要获得日历信息,那么 calendar 模块非常有用。 monthrange()函数会返回包含星期和该月天数的元组。

    知道了该月的天数,那么结束日期就可以通过在开始日期上面加上这个天数获得。 有个需要注意的是结束日期并不包含在这个日期范围内(事实上它是下个月的开始日期)。 这个和Python的 slice 与 range 操作行为保持一致,同样也不包含结尾。

    为了在日期范围上循环,要使用到标准的数学和比较操作。 比如,可以利用 timedelta 实例来递增日期,小于号<用来检查一个日期是否在结束日期之前。

    相关文章

      网友评论

          本文标题:Python3 - 计算当前月份的日期范围

          本文链接:https://www.haomeiwen.com/subject/cnhpkqtx.html