datetime:標準庫,基本日期時間運算dateutil.relativedelta:精確年/月/日差異(需安裝 python-dateutil)dateutil.rrule:依規則計算週數/天數
from datetime import date
d1 = date(2024, 1, 1)
d2 = date(2024, 12, 31)
delta = d2 - d1
print(delta.days) # 365
from dateutil import rrule
from datetime import date
def weeks_between(start, end):
"""計算兩日期間完整週數(以週為單位計數)"""
return rrule.rrule(rrule.WEEKLY, dtstart=start, until=end).count()
# 測試
starts = [date(2005, 1, 3), date(2005, 1, 4)]
end = date(2005, 1, 10)
for s in starts:
days = rrule.rrule(rrule.DAILY, dtstart=s, until=end).count()
weeks = weeks_between(s, end)
print(f"{days} 天 = {weeks} 週")
# 輸出:
# 7 天 = 1 週
# 8 天 = 2 週 (rrule 以整數週計算)
from dateutil.relativedelta import relativedelta
from datetime import date
d1 = date(2020, 2, 28)
d2 = date(2024, 3, 1)
diff = relativedelta(d2, d1)
print(f"{diff.years} 年 {diff.months} 月 {diff.days} 天")
# 4 年 0 月 2 天
# 也可直接取得總月數
total_months = diff.years * 12 + diff.months
print(f"總月數: {total_months}")
| 需求 | 推薦方法 |
|---|---|
| 單純天數差 | (d2 - d1).days |
| 週數(整數) | rrule(WEEKLY, dtstart=d1, until=d2).count() |
| 月數差(近似) | (d2.year - d1.year) * 12 + d2.month - d1.month |
| 精確年/月/日 | relativedelta(d2, d1) |
| 工作日天數 | numpy.busday_count 或自行迴圈判斷 |
| 兩時間完整差異 | datetime.combine + relativedelta |
pip install python-dateutil