如何优雅实现指定月份datetime.date对象的遍历(无填充日期)
当然有更简洁优雅的实现方式!给你两种实用的方案,都比你当前的切片方法更直观健壮:
方案1:纯datetime模块实现(无需calendar)
直接从当月第一天开始,逐天递增到当月最后一天,完全不会引入无关日期:
from datetime import date, timedelta year = 2019 month = 7 # 当月第一天 start = date(year, month, 1) # 下月第一天减一天就是当月最后一天 end = date(year, month + 1, 1) - timedelta(days=1) current = start while current <= end: print(current) current += timedelta(days=1)
这个方法逻辑清晰,不需要依赖calendar模块的细节,兼容性也更好。
方案2:改进calendar模块的用法(过滤无关日期)
如果还是想用calendar模块,直接过滤掉不属于目标月份的日期就行,比切片更健壮(比如当周起始日不是周日时,itermonthdates开头可能会有上个月的日期,切片就会出错):
from calendar import Calendar year = 2019 month = 7 cal = Calendar() for dt in cal.itermonthdates(year, month): # 只保留目标月份的日期 if dt.month == month: print(dt)
这个方法利用了calendar的迭代器,同时通过简单的条件判断剔除填充日期,代码简洁且逻辑明确。
对比你原来的切片方法,这两种方案都更具可读性和健壮性,不会因为日历的周起始设置而出现错误~
内容的提问来源于stack exchange,提问作者Chgad
相关产品推荐
相关产品推荐

