dateutil模塊主要有兩個函數(shù),parser和rrule。
其中parser是根據(jù)字符串解析成datetime,而rrule則是根據(jù)定義的規(guī)則來生成datetime。
安裝
直接用easy_install或pip在線安裝
easy_install python-dateutil
pip install python-dateutil
1、 parser
parser是根據(jù)字符串解析成datetime,字符串可以很隨意,可以用時間日期的英文單詞,可以用橫線、逗號、空格等做分隔符。
沒指定時間默認是0點,沒指定日期默認是今天,沒指定年份默認是今年。
>>> from dateutil.parser import parse
>>> parse("2018-10-21")
datetime.datetime(2018, 10, 21, 0, 0)
>>> parse("20181021")
datetime.datetime(2018, 10, 21, 0, 0)
>>> parse("2018/10/21")
datetime.datetime(2018, 10, 21, 0, 0)
>>> parse("10-21")
datetime.datetime(2018, 10, 21, 0, 0)
>>> parse("10/21")
datetime.datetime(2018, 10, 21, 0, 0)
只有月日時,parser會將分隔符前面的數(shù)字解析為月份,后面的為日
當有年份時,在前面的月份超出范圍時,會自動判斷哪個是月哪個是日
>>> parse("3/8")
datetime.datetime(2018, 3, 8, 0, 0)
>>> parse("8/3")
datetime.datetime(2018, 8, 3, 0, 0)
>>> parse("3-8")
datetime.datetime(2018, 3, 8, 0, 0)
>>> parse("8-3")
datetime.datetime(2018, 8, 3, 0, 0)
>>> parse("21/10")
ValueError: month must be in 1..12
>>> parse("3/8/2018")
datetime.datetime(2018, 3, 8, 0, 0)
>>> parse("8/3/2018")
datetime.datetime(2018, 8, 3, 0, 0)
>>> parse("2018/3/8")
datetime.datetime(2018, 3, 8, 0, 0)
>>> parse("3/15/2018")
datetime.datetime(2018, 3, 15, 0, 0)
當前面的月份超過12時,parser會自動識別月和日
>>> parse("15/3/2018")
datetime.datetime(2018, 3, 15, 0, 0)
分隔符改成"-"也一樣
>>> parse("15-3-2018")
datetime.datetime(2018, 3, 15, 0, 0)
但是當年份放在前面時,只能按年-月-日的順序
>>> parse("2018/15/3")
ValueError: month must be in 1..12
當分隔符為逗號時,只有月-日時,要把月放在前面
有年份時,年份要放在后面
>>> parse("3,15")
datetime.datetime(2018, 3, 15, 0, 0)
只識別到了前面的日,月將本月11月作為默認月
>>> parse("15,3")
datetime.datetime(2018, 11, 15, 0, 0)
>>> parse("3,15,2018")
datetime.datetime(2018, 3, 15, 0, 0)
>>> parse("2018,3,15")
ValueError: ('Unknown string format:', '2018,3,15')
parser還可以識別英文的月、日
>>> parse("Mar 15")
datetime.datetime(2018, 3, 15, 0, 0)
沒有空格也可以
>>> parse("Mar15")
datetime.datetime(2018, 3, 15, 0, 0)
>>> parse("15 Mar")
datetime.datetime(2018, 3, 15, 0, 0)
>>> parse("Mar 1st")
datetime.datetime(2018, 3, 1, 0, 0)
>>> parse("Mar 15 2018")
datetime.datetime(2018, 3, 15, 0, 0)
>>> parse("2018 Mar15")
datetime.datetime(2018, 3, 15, 0, 0)
2、rrule
rrule(self, freq, dtstart=None, interval=1, wkst=None,count=None, until=None, bysetpos=None,bymonth=None, bymonthday=None, byyearday=None, byeaster=None,byweekno=None, byweekday=None, byhour=None, byminute=None, bysecond=None,cache=False)
- freq:可以理解為單位??梢允?YEARLY, MONTHLY, WEEKLY,DAILY, HOURLY, MINUTELY, SECONDLY。即年月日周時分秒
- dtstart,until:是開始和結束時間
- wkst:周開始時間
- interval:間隔
- count:指定生成多少個
- byxxx:指定匹配的周期。比如byweekday=(MO,TU)則只有周一周二的匹配。byweekday可以指定MO,TU,WE,TH,FR,SA,SU。即周一到周日。
>>> from dateutil import rrule
生成一個連續(xù)的日期列表
>>> list(rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0),
datetime.datetime(2018, 11, 2, 0, 0),
datetime.datetime(2018, 11, 3, 0, 0),
datetime.datetime(2018, 11, 4, 0, 0),
datetime.datetime(2018, 11, 5, 0, 0)]
間隔一天
>>> list(rrule.rrule(rrule.DAILY,interval=2,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0),
datetime.datetime(2018, 11, 3, 0, 0),
datetime.datetime(2018, 11, 5, 0, 0)]
只保留前3個元素
>>> list(rrule.rrule(rrule.DAILY,count=3,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0),
datetime.datetime(2018, 11, 2, 0, 0),
datetime.datetime(2018, 11, 3, 0, 0)]
只要周一的
>>> list(rrule.rrule(rrule.DAILY,byweekday=rrule.MO,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 5, 0, 0)]
只要周六和周日的
>>> list(rrule.rrule(rrule.DAILY,byweekday=(rrule.SA,rrule.SU),dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 3, 0, 0),
datetime.datetime(2018, 11, 4, 0, 0)]
以月為間隔
>>> list(rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-7-30')))
[datetime.datetime(2018, 3, 15, 0, 0),
datetime.datetime(2018, 4, 15, 0, 0),
datetime.datetime(2018, 5, 15, 0, 0),
datetime.datetime(2018, 6, 15, 0, 0),
datetime.datetime(2018, 7, 15, 0, 0)]
計算時間差
rrule可計算出兩個datetime對象間相差的年月日等時間數(shù)量
兩個日期相差10天
>>> rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=parse('2018-11-10')).count()
10
某個日期到今天相差多少天
>>> rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=datetime.date.today()).count()
10
兩個日期相差幾個月
前一個月為m月,后一個月為n月,當日期不滿整月時,差的月數(shù)按n-m算,當日期滿整月后,差的月數(shù)按n-m+1算。
差的年數(shù)同月數(shù)的情況一樣。
例子如下:
>>> rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-11-10')).count()
8
>>> rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-11-20')).count()
9
>>> rrule.rrule(rrule.YEARLY,dtstart=parse('2016-3-15'),until=parse('2018-2-10')).count()
2
>>> rrule.rrule(rrule.YEARLY,dtstart=parse('2016-3-15'),until=parse('2018-3-15')).count()
3