3.14计算当前月份的日期范围
问题:
你的代码需要在当前月份中循环每一天,想要找到一个计算这个日期范围的高效方法。
解决方案:
在这样的日期上循环并需要事先沟通构造又给包含所有日期的列表,你可以先计算出开始日期和结束日期,然后在你步进的时候使用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)
a_day = timedelta(days=1)
first_day, last_day = get_month_range()
while first_day < last_day:
print(first_day)
first_day += a_day
'''
2022-03-01
2022-03-02
2022-03-03
2022-03-04
2022-03-05
2022-03-06
2022-03-07
.
.
2022-03-27
2022-03-28
2022-03-29
2022-03-30
2022-03-31
'''
讨论:
上面的代码先计算出一个对应月份第一天的日期。一个快速的方法就是使用date或datetime对象replace()方法简单的将days属性设置成1即可,replace()方法一个好处就是它会创建和你开始传入对象类型相同的对象。所以,如果输入参数是一个datetime实例,那么你得到的就是一个datetime实例,那么你得到的就是一个datetime实例。
然后,使用calendar.monthrange()函数来找出该月的总天数。任何时候只要你想获得日历信息,那么calendar模块就会非常有用了。monthrange()函数会返回包含星期和该月天数的元组。
一旦该月的天数已知了,那么结束日期就是可以通过在开始日期上面加上这个天数获得。有个需要注意的是结束日期并不包含在这个日期范围内(事实上它是下个月的开始日期)。这个和python的slice与range操作行为保持一致,同样也不包含结尾。
为了在日期范围上循环,要使用到标准的数学和比较操作。比如,可以利用timedelta实例来递增日期,小于号<使用检查一个日期是否在结束日期之前。
理想情况下,如果能为日期迭代创建一个同内置的range()函数一样的函数就好了,幸运的是,可以使用又给生成器来很容易的实现这个目标:
def date_range(start,stop,step):
while start <stop:
yield start
start+=step
for d in date_range(datetime(2022,3,15),datetime(2022,3,20),timedelta(hours=6)):
print(d)
'''
2022-03-15 00:00:00
2022-03-15 06:00:00
2022-03-15 12:00:00
2022-03-15 18:00:00
2022-03-16 00:00:00
2022-03-16 06:00:00
2022-03-16 12:00:00
2022-03-16 18:00:00
2022-03-17 00:00:00
2022-03-17 06:00:00
2022-03-17 12:00:00
2022-03-17 18:00:00
2022-03-18 00:00:00
2022-03-18 06:00:00
2022-03-18 12:00:00
2022-03-18 18:00:00
2022-03-19 00:00:00
2022-03-19 06:00:00
2022-03-19 12:00:00
2022-03-19 18:00:00
'''
这种实现之所以这么简单,还得归功于pyhton中的日期和时间能够使用标准的数学和比较操作符来进行运算。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通