原文連結:https://www.jianshu.com/p/f29dddce3a9a
dateutil子產品主要有兩個函數,parser和rrule。
其中parser是根據字元串解析成datetime,而rrule則是根據定義的規則來生成datetime。
安裝
直接用easy_install或pip線上安裝
easy_install python-dateutil
pip install python-dateutil
複制
1、 parser
parser是根據字元串解析成datetime,字元串可以很随意,可以用時間日期的英文單詞,可以用橫線、逗号、空格等做分隔符。
沒指定時間預設是0點,沒指定日期預設是今天,沒指定年份預設是今年。
>>> from dateutil.parser import parse
>>> parse("2018-10-21")
datetime.datetime(2018, 10, 21, 0, 0)
>>> parse('16:59:59') # 預設日期為系統日期
datetime.datetime(2018, 11, 1, 16, 59, 59)
>>> 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)
# fuzzy開啟模糊比對,過濾掉無法識别的時間日期字元
>>> parse("this is the wonderful moment 16:59:59,I feel good",fuzzy=True)
datetime.datetime(2018, 11, 1, 16, 59, 59)
複制
隻有月日時,parser會将分隔符前面的數字解析為月份,後面的為日
當有年份時,在前面的月份超出範圍時,會自動判斷哪個是月哪個是日
>>> 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
生成一個連續的日期清單
>>> 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對象間相差的年月日等時間數量
兩個日期相差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月,當日期不滿整月時,差的月數按n-m算,當日期滿整月後,差的月數按n-m+1算。
差的年數同月數的情況一樣。
例子如下:
>>> 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
複制
來源:https://www.jianshu.com/p/f29dddce3a9a
官方文檔 : http://labix.org/python-dateutil
pypi:https://pypi.org/project/python-dateutil/