在日常开发中,日期和时间的处理一直是让人头疼的事情。虽然 python 内置的 datetime 模块功能强大,但使用起来冗长、容易出错,对时区支持也不够友好。而 pendulum 正是为了解决这些痛点而生的现代化日期时间库。
本文将全面介绍 pendulum 的特点、用法以及典型应用场景,并与 datetime 模块进行对比,帮助你在实际项目中优雅地处理时间逻辑。
一、为什么选择 pendulum
在你接触 pendulum 之前,可能已经习惯于这样写代码:
from datetime import datetime, timedelta, timezone now = datetime.now() later = now + timedelta(days=3)
然而,如果你需要处理时区转换、自然语言式时间表达、日期范围、持续时间等需求时,datetime 的语法就显得冗长而繁琐。
而使用 pendulum,代码变成这样:
import pendulum now = pendulum.now("asia/shanghai") later = now.add(days=3)
是不是清晰不少?
二、安装 pendulum
pendulum 可以通过 pip 快速安装:
pip install pendulum
安装完成后,导入方式非常简单:
import pendulum
三、核心功能与语法解析
3.1 获取当前时间
pendulum.now() # 使用本地时区 pendulum.now("utc") # 使用指定时区 pendulum.today("asia/shanghai") # 获取今天0点 pendulum.yesterday("asia/shanghai") # 获取昨天 pendulum.tomorrow("asia/shanghai") # 获取明天
3.2 创建时间对象
dt = pendulum.datetime(2025, 6, 4, 15, 30, tz="asia/shanghai")
相比原生 datetime.datetime,pendulum.datetime 支持直接指定时区字符串,无需手动构造 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)
甚至可以链式调用:
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 时区处理
dt = pendulum.datetime(2025, 6, 4, 15, 30, tz="utc") local_dt = dt.in_timezone("asia/shanghai")
还可以轻松获取所有时区:
pendulum.timezones # 返回所有支持的时区列表
3.7 格式化与字符串转换
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 持续时间(durations)
duration = pendulum.duration(days=2, hours=5, minutes=30) print(duration.total_minutes()) # 2*24*60 + 5*60 + 30 = 3090
你也可以对时间进行差值计算:
start = pendulum.datetime(2025, 6, 1) end = pendulum.datetime(2025, 6, 4) diff = end - start print(diff.in_days()) # 3
四、日期区间与范围处理
处理时间段是数据分析、报表等任务的常见需求。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)) # 判断某个时间是否在范围内
五、与 datetime 的兼容性
pendulum 是 datetime 的完全替代品,它继承了 datetime.datetime,并向下兼容所有用法。
from datetime import datetime import pendulum dt = pendulum.now() isinstance(dt, datetime) # true
这意味着你可以在现有项目中逐步替换 datetime 为 pendulum,无需大改动。
六、典型应用场景
6.1 多时区日程应用
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 自动任务触发器
now = pendulum.now() if now.is_weekday() and now.hour == 9: print("开始执行每日工作任务")
6.3 数据报表日期范围
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 |
---|---|---|---|
原生支持时区 | ❌ | ✅ | ✅(强) |
人性化输出 | ❌ | ✅ | ✅(更好) |
日期范围处理 | ❌ | ✅ | ✅ |
国际化支持 | ❌ | ✅ | ✅(多语言) |
与原生兼容性 | ✅ | ❌ | ✅ |
安装包体积 | 小 | 中 | 中 |
pendulum 结合了 arrow 的易用性和 datetime 的兼容性,是目前处理时间的最佳选择之一。
八、总结
pendulum 是一个现代化、直观且功能丰富的 python 时间处理库。无论你是开发金融系统、定时任务调度、日志系统,还是需要处理复杂的时间逻辑,pendulum 都能大大简化你的代码。
推荐理由总结:
- api 更加直观
- 对时区支持优秀
- 支持日期范围
- 高度兼容 datetime
- 支持人类可读输出
- 性能优于 arrow
如果你还在用 datetime 并苦于写一堆格式转换、手动处理时区和计算间隔,不妨从下一个项目开始试试 pendulum,相信你会爱上它。
到此这篇关于python使用pendulum优雅处理日期与时间的文章就介绍到这了,更多相关python pendulum处理日期与时间内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论