簡介
dateutil
爲Python標準庫datetime
提供了強大的擴展
功能:
- 相對時間。如下週一、下個月、明年
- 兩個日期間的差。
- 靈活日期解析。使用iCalendar規範的超集,支持RFC字符串解析
- 幾乎所有字符串格式的日期解析。
- 實現各種各樣格式文件
- 最新世界時區信息
- 計算任何給定年份的復活節星期日日期
- 全面的測試套件
安裝
pip install python-dateutil
初試
from dateutil.rrule import *
from dateutil.parser import *
from dateutil.easter import *
from dateutil.relativedelta import *
now = parse("May 20 13:14:00 UTC 2020") # UTC爲世界統一時間
today = now.date() # 轉換爲日期
year = rrule(YEARLY, dtstart=now, bymonth=8, bymonthday=13, byweekday=FR)[0].year
rdelta = relativedelta(easter(year), today)
print("今天是: {}".format(today))
print("下一個8.13爲週五在 {} 年".format(year))
print("那一年的復活節離現在有多遠: {}".format(rdelta))
print("那一年的復活節日期: {}".format(today + rdelta))
# 今天是: 2020-05-20
# 下一個8.13爲週五在 2021 年
# 那一年的復活節離現在有多遠: relativedelta(months=+10, days=+15)
# 那一年的復活節日期: 2021-04-04
相對時間
使用dateutil.relativedelta
類初始化設置的參數,並進行+操作
相對時間:years, months, days等,帶s結尾
絕對時間:year, month, day等
import calendar
from datetime import *
from dateutil.relativedelta import *
NOW = datetime.now()
TODAY = date.today()
print('現在時間', NOW)
print('今天日期', TODAY)
print('下個月', NOW + relativedelta(months=+1)) # 注意參數有s
print('下個月再加一週', NOW + relativedelta(months=+1, weeks=+1))
print('下個月再加一週的早上10點', TODAY + relativedelta(months=+1, weeks=+1, hour=10)) # 注意用的是日期,且hour沒s
print('一年前一個月', NOW + relativedelta(years=+1, months=-1))
print('下週五', TODAY + relativedelta(weekday=FR))
print('下週五', TODAY + relativedelta(weekday=calendar.FRIDAY))
print('下週三', TODAY + relativedelta(weekday=WE(+1))) # 如果今天爲週三則返回今天
print('下週三', TODAY + relativedelta(days=+1, weekday=WE(+1))) # 即使今天週三也返回下週三
print('這個月最後的週五', TODAY + relativedelta(day=31, weekday=FR(-1)))
print('距離下個世紀還有', relativedelta(datetime(2100, 1, 1), TODAY)) # 作差
print('2020年母親節', datetime(2020, 5, 1) + relativedelta(weekday=SU(+2))) # 公曆5月第2個週日是母親節
print('XerCis幾歲了', relativedelta(NOW, datetime(1997, 6, 19, 12, 0)))
print('今年第260天的日期', date(2020, 1, 1) + relativedelta(yearday=260))
處理不同天數的月份永遠不會跨越月的邊界,年同理
from datetime import *
from dateutil.relativedelta import *
# 處理不同天數的月份永遠不會跨越月的邊界
print(date(2003, 1, 27) + relativedelta(months=+1)) # 2003-02-27
print(date(2003, 1, 31) + relativedelta(months=+1)) # 2003-02-28
print(date(2003, 1, 31) + relativedelta(months=+2)) # 2003-03-31
# 年同理
print(date(2000, 2, 28) + relativedelta(years=+1)) # 2001-02-28
print(date(2000, 2, 29) + relativedelta(years=+1)) # 2001-02-28