H.C*_*hoi 3 python datetime date
我有这样的代码:
import time
from datetime import date
startyear = raw_input("start year: ")
startmonth = raw_input("start month: ")
startday = raw_input("start day: ")
endyear = raw_input("end year: ")
endmonth = raw_input("end month: ")
endday = raw_input("end day: ")
startdate = date(int(startyear), int(startmonth), int(startday))
while startdate < date(int(endyear), int(endmonth), int(endday)):
print startdate
startdate = startdate.replace(day=startdate.day + 1)
Run Code Online (Sandbox Code Playgroud)
这段代码的作用是:
1.通过手动输入
确定开始和结束日期2.生成它们之间的日期列表
但问题是,如果我设置日期,例如,
startdate: 2012-10-28
enddate: 2012-11-4
输出将是:
2012-10-28
2012-10-29
2012-10-30
2012-10-31
ValueError: day is out of range for month
Run Code Online (Sandbox Code Playgroud)
我希望输出如下:
2012-10-28
2012-10-29
2012-10-30
2012-10-31
2012-11-01
2012-11-02
2012-11-03
2012-11-04
Run Code Online (Sandbox Code Playgroud)
所以我希望这些日期能够持续一个月.有什么建议?任何帮助都会非常棒.
有一个名为python-dateutil的模块,对于这种事情非常有用:
from datetime import datetime
from dateutil.rrule import rrule, DAILY
list(rrule(DAILY, dtstart=datetime(2012, 11, 24), until=datetime(2012,11,30)))
# [datetime.datetime(2012, 11, 24, 0, 0), datetime.datetime(2012, 11, 25, 0, 0), datetime.datetime(2012, 11, 26, 0, 0), datetime.datetime(2012, 11, 27, 0, 0), datetime.datetime(2012, 11, 28, 0, 0), datetime.datetime(2012, 11, 29, 0, 0), datetime.datetime(2012, 11, 30, 0, 0)]
Run Code Online (Sandbox Code Playgroud)
并且还有其他选项,例如,一周中的几天(对于工作周内仅包括MO,TU,WE,TH,FR有用):
from dateutil.rrule import MO, WE
list(rrule(DAILY, byweekday=[MO, WE], dtstart=datetime(2012, 11, 24), until=datetime(2012,11,30))
# [datetime.datetime(2012, 11, 26, 0, 0), datetime.datetime(2012, 11, 28, 0, 0)]
Run Code Online (Sandbox Code Playgroud)
而不是startdate.replace(),你应该使用timedelta......
from datetime import date, timedelta
# Get input here...
while startdate < date(int(endyear), int(endmonth), int(endday)):
print startdate
startdate += timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1673 次 |
| 最近记录: |