Python使用Pendulum優(yōu)雅處理日期與時間
在日常開發(fā)中,日期和時間的處理一直是讓人頭疼的事情。雖然 Python 內(nèi)置的 datetime 模塊功能強(qiáng)大,但使用起來冗長、容易出錯,對時區(qū)支持也不夠友好。而 pendulum 正是為了解決這些痛點(diǎn)而生的現(xiàn)代化日期時間庫。
本文將全面介紹 pendulum 的特點(diǎn)、用法以及典型應(yīng)用場景,并與 datetime 模塊進(jìn)行對比,幫助你在實(shí)際項目中優(yōu)雅地處理時間邏輯。
一、為什么選擇 Pendulum
在你接觸 pendulum 之前,可能已經(jīng)習(xí)慣于這樣寫代碼:
from datetime import datetime, timedelta, timezone now = datetime.now() later = now + timedelta(days=3)
然而,如果你需要處理時區(qū)轉(zhuǎn)換、自然語言式時間表達(dá)、日期范圍、持續(xù)時間等需求時,datetime 的語法就顯得冗長而繁瑣。
而使用 pendulum,代碼變成這樣:
import pendulum now = pendulum.now("Asia/Shanghai") later = now.add(days=3)
是不是清晰不少?
二、安裝 Pendulum
Pendulum 可以通過 pip 快速安裝:
pip install pendulum
安裝完成后,導(dǎo)入方式非常簡單:
import pendulum
三、核心功能與語法解析
3.1 獲取當(dāng)前時間
pendulum.now() # 使用本地時區(qū) pendulum.now("UTC") # 使用指定時區(qū) pendulum.today("Asia/Shanghai") # 獲取今天0點(diǎn) pendulum.yesterday("Asia/Shanghai") # 獲取昨天 pendulum.tomorrow("Asia/Shanghai") # 獲取明天
3.2 創(chuàng)建時間對象
dt = pendulum.datetime(2025, 6, 4, 15, 30, tz="Asia/Shanghai")
相比原生 datetime.datetime,pendulum.datetime 支持直接指定時區(qū)字符串,無需手動構(gòu)造 timezone 對象。
還可以通過 from_format 快速解析:
dt = pendulum.from_format("2025-06-04 15:30", "YYYY-MM-DD HH:mm", tz="Asia/Shanghai")
3.3 自然語言解析時間
pendulum.parse("2025-06-04T15:30:00+08:00") pendulum.parse("2025-06-04 15:30:00", tz="Asia/Shanghai")
3.4 時間加減(Duration)
now = pendulum.now() three_days_later = now.add(days=3) one_week_ago = now.subtract(weeks=1)
甚至可以鏈?zhǔn)秸{(diào)用:
now.add(days=1).subtract(hours=2)
3.5 時間比較
dt1 = pendulum.datetime(2025, 6, 1) dt2 = pendulum.datetime(2025, 6, 4) print(dt1 < dt2) # True print(dt1.diff(dt2).in_days()) # 3
支持 .is_before()、.is_after()、.is_same_day() 等方法。
3.6 時區(qū)處理
dt = pendulum.datetime(2025, 6, 4, 15, 30, tz="UTC") local_dt = dt.in_timezone("Asia/Shanghai")
還可以輕松獲取所有時區(qū):
pendulum.timezones # 返回所有支持的時區(qū)列表
3.7 格式化與字符串轉(zhuǎn)換
now = pendulum.now() print(now.to_datetime_string()) # "2025-06-04 15:30:00" print(now.format("YYYY-MM-DD HH:mm")) # "2025-06-04 15:30"
支持使用 moment.js 的格式化語法,非常自然。
3.8 持續(xù)時間(Durations)
duration = pendulum.duration(days=2, hours=5, minutes=30) print(duration.total_minutes()) # 2*24*60 + 5*60 + 30 = 3090
你也可以對時間進(jìn)行差值計算:
start = pendulum.datetime(2025, 6, 1) end = pendulum.datetime(2025, 6, 4) diff = end - start print(diff.in_days()) # 3
四、日期區(qū)間與范圍處理
處理時間段是數(shù)據(jù)分析、報表等任務(wù)的常見需求。pendulum 提供 period 和 intervals 工具:
start = pendulum.datetime(2025, 6, 1) end = pendulum.datetime(2025, 6, 10) period = pendulum.period(start, end) for dt in period.range("days"): print(dt.to_date_string())
還可以使用:
period.days # 獲取所有日期組成的列表 period.includes(pendulum.datetime(2025, 6, 4)) # 判斷某個時間是否在范圍內(nèi)
五、與 datetime 的兼容性
pendulum 是 datetime 的完全替代品,它繼承了 datetime.datetime,并向下兼容所有用法。
from datetime import datetime import pendulum dt = pendulum.now() isinstance(dt, datetime) # True
這意味著你可以在現(xiàn)有項目中逐步替換 datetime 為 pendulum,無需大改動。
六、典型應(yīng)用場景
6.1 多時區(qū)日程應(yīng)用
event_time = pendulum.parse("2025-06-04 18:00", tz="America/New_York") user_time = event_time.in_timezone("Asia/Shanghai") print(user_time.format("YYYY-MM-DD HH:mm"))
6.2 自動任務(wù)觸發(fā)器
now = pendulum.now() if now.is_weekday() and now.hour == 9: print("開始執(zhí)行每日工作任務(wù)")
6.3 數(shù)據(jù)報表日期范圍
start = pendulum.today().subtract(days=6) end = pendulum.today() for day in pendulum.period(start, end).range("days"): print(f"處理報表:{day.to_date_string()}")
6.4 人類可讀的時間間隔(humanize)
dt = pendulum.now().subtract(days=2, hours=3) print(dt.diff_for_humans()) # “2 days ago”
支持中英文,適合用于日志、用戶提示信息等。
七、與其他時間庫對比
特性 | datetime | arrow | pendulum |
---|---|---|---|
原生支持時區(qū) | ? | ? | ?(強(qiáng)) |
人性化輸出 | ? | ? | ?(更好) |
日期范圍處理 | ? | ? | ? |
國際化支持 | ? | ? | ?(多語言) |
與原生兼容性 | ? | ? | ? |
安裝包體積 | 小 | 中 | 中 |
pendulum 結(jié)合了 arrow 的易用性和 datetime 的兼容性,是目前處理時間的最佳選擇之一。
八、總結(jié)
pendulum 是一個現(xiàn)代化、直觀且功能豐富的 Python 時間處理庫。無論你是開發(fā)金融系統(tǒng)、定時任務(wù)調(diào)度、日志系統(tǒng),還是需要處理復(fù)雜的時間邏輯,pendulum 都能大大簡化你的代碼。
推薦理由總結(jié):
- API 更加直觀
- 對時區(qū)支持優(yōu)秀
- 支持日期范圍
- 高度兼容 datetime
- 支持人類可讀輸出
- 性能優(yōu)于 arrow
如果你還在用 datetime 并苦于寫一堆格式轉(zhuǎn)換、手動處理時區(qū)和計算間隔,不妨從下一個項目開始試試 pendulum,相信你會愛上它。
到此這篇關(guān)于Python使用Pendulum優(yōu)雅處理日期與時間的文章就介紹到這了,更多相關(guān)Python Pendulum處理日期與時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例,文中用來解決多臺服務(wù)器維護(hù)文件同步問題,需要的朋友可以參考下2014-06-06Python基于自然語言處理開發(fā)文本摘要系統(tǒng)
自然語言處理(NLP)是人工智能領(lǐng)域中一個重要的研究方向,而文本摘要作為NLP的一個重要應(yīng)用,在信息爆炸的時代具有重要意義,下面我們來看看如何開發(fā)一個基于Python的文本摘要系統(tǒng)吧2025-04-04Python 運(yùn)行 shell 獲取輸出結(jié)果的實(shí)例
今天小編就為大家分享一篇Python 運(yùn)行 shell 獲取輸出結(jié)果的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式
這篇文章主要介紹了Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Python實(shí)現(xiàn)美化版端口進(jìn)程管理工具
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一個美化版的端口進(jìn)程管理工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-03-03