# pendulum,一个时间处理精准的 Python 库!
很多小伙伴初学Python处理时间时,都被标准库datetime折腾过——时区转换绕来绕去、时间加减写法繁琐、显示成“多久前”还要自己写逻辑。我当初踩了不少坑,直到遇到pendulum这个库,它把时间处理的各种细节都封装好了,API写起来像说话一样自然,时区处理还特别精准。今天就带大家从零上手,搞定日常90%的时间处理需求。
## 一、安装导入:一分钟开启精准时间处理
pendulum是第三方库,需要先安装,我习惯用pip一键安装,打开终端输一行命令就行:
```python
pip install pendulum
安装好之后直接导入就能用,不用复杂配置,开箱即用:
import pendulum
小贴士:下载慢的小伙伴可以加上清华镜像源,命令改成 pip install pendulum -i https://pypi.tuna.tsinghua.edu.cn/simple,下载速度会快很多。
二、创建时间对象:写法直观,默认带时区
在pendulum里,所有时间都是带有时区信息的,不会出现标准库里“无时区时间”容易算错的坑,创建方式也特别好懂,新手看一眼就会。
最常用的就是获取当前时间,用now()方法,还可以直接指定时区:
# 获取当前本地时间
now = pendulum.now()
print("当前时间:", now)
# 获取指定时区的当前时间,比如上海时区
shanghai_now = pendulum.now("Asia/Shanghai")
print("上海当前时间:", shanghai_now)
运行后你会看到时间后面带着+08:00这样的时区偏移,这就说明它是带时区的“清醒时间”,后续跨时区计算不会出错。
如果要创建指定日期时间,用datetime()方法,年月日是必填参数,时分秒可以按需补充:
# 创建指定时间,默认UTC时区
dt = pendulum.datetime(2026, 10, 1, 8, 30, 0)
print("指定时间(UTC):", dt)
# 创建带上海时区的指定时间
dt_sh = pendulum.datetime(2026, 10, 1, 8, 30, 0, tz="Asia/Shanghai")
print("指定时间(上海):", dt_sh)
除此之外还有几个懒人方法,直接获取今天、昨天、明天的零点时间,做日期统计特别方便:
today = pendulum.today() # 今天零点
yesterday = pendulum.yesterday() # 昨天零点
tomorrow = pendulum.tomorrow() # 明天零点
三、时区转换:一行代码搞定全球时间
这是我觉得pendulum最香的功能之一。以前用datetime转时区,要先导入时区模块、再本地化、再转换,步骤多还容易踩夏令时的坑。在pendulum里,只要调用in_timezone()方法,一行就搞定,所有细节库都帮我们处理了。
举个例子,我们知道上海早上8点半,想知道纽约对应是几点:
# 上海时间 2026年10月1日 早上8:30
sh_time = pendulum.datetime(2026, 10, 1, 8, 30, 0, tz="Asia/Shanghai")
# 转换为纽约时区
ny_time = sh_time.in_timezone("America/New_York")
print("纽约对应时间:", ny_time)
运行后就能直接算出对应时间,夏令时、冬令时这些复杂规则库都内置好了,完全不用自己查资料计算。
注意:时区名称要按国际标准写法,比如Asia/Shanghai、Europe/London,不要写“北京”“上海”这种中文,不然会识别不出来哦。
四、时间加减:自然语言式写法,计算超省心
做时间计算是日常高频需求,比如算“3天之后截止”“2个小时前发布”。pendulum的add()和subtract()方法写起来特别直观,参数直接写单位名就行,不用记复杂的参数顺序。
dt = pendulum.datetime(2026, 10, 1, 8, 30, 0, tz="Asia/Shanghai")
# 加1年2个月3天
later = dt.add(years=1, months=2, days=3)
print("加完时间:", later)
# 减5小时30分钟
ago = dt.subtract(hours=5, minutes=30)
print("减去时间:", ago)
它还支持链式调用,想怎么算就怎么串,代码读起来就像说话一样通顺:
# 先加一周,再减2天,最后转成伦敦时间
result = dt.add(weeks=1).subtract(days=2).in_timezone("Europe/London")
除了单点计算,算两个时间的间隔也很简单,用diff()方法,还能直接转换成天、小时、秒等不同单位:
start = pendulum.datetime(2026, 1, 1)
end = pendulum.datetime(2026, 10, 1)
# 计算时间差
diff = end.diff(start)
print("相差天数:", diff.in_days())
print("相差总小时:", diff.in_hours())
五、格式化与人性化输出:用户友好的时间展示
做项目的时候,我们经常要把时间转成指定格式的字符串,或者显示成“3分钟前”“2天后”这种人性化文字,pendulum都帮我们封装好了,不用自己写判断逻辑。
5.1 自定义格式化
用format()方法,按照规则传格式字符串就行,常用的格式比如年月日、时分秒都能轻松实现:
dt = pendulum.datetime(2026, 10, 1, 8, 30, 0, tz="Asia/Shanghai")
# 转成 2026-10-01 08:30:00 格式
print(dt.format("YYYY-MM-DD HH:mm:ss"))
# 转成更口语化的中文格式
print(dt.format("YYYY年MM月DD日 HH点mm分"))
5.2 人性化相对时间
这个功能做博客、社交APP、消息通知特别实用,不用自己写一堆if判断,调用diff_for_humans()就能生成“多久前”“多久后”的文字。我们还可以设置成中文显示:
# 设置中文语言
pendulum.set_locale("zh")
# 3小时前的时间
three_hours_ago = pendulum.now().subtract(hours=3)
print(three_hours_ago.diff_for_humans()) # 输出:3小时前
# 5天后的时间
five_days_later = pendulum.now().add(days=5)
print(five_days_later.diff_for_humans()) # 输出:5天后
小贴士:pendulum的时间对象是不可变的,所有修改操作都会返回一个新对象,不会改变原来的时间。这一点设计很友好,不会出现不小心改了原数据的隐蔽bug。
六、动手练一练:综合小练习
学到这里,我们来做个小练习巩固一下:计算今天距离2026年国庆节还有多少天,同时把国庆节当天的上海时间转换成伦敦时间,并用中文人性化显示距离国庆还有多久。
参考代码:
import pendulum
# 设置中文显示
pendulum.set_locale("zh")
# 今天的日期(上海时区)
today = pendulum.today(tz="Asia/Shanghai")
# 2026年国庆日期
national_day = pendulum.datetime(2026, 10, 1, tz="Asia/Shanghai")
# 计算相差天数
days_left = national_day.diff(today).in_days()
print(f"距离国庆节还有 {days_left} 天")
# 人性化相对时间展示
print("人性化显示:", national_day.diff_for_humans())
# 转换成伦敦时间
ldn_national = national_day.in_timezone("Europe/London")
print("伦敦对应时间:", ldn_national.format("YYYY-MM-DD HH:mm:ss"))
大家可以自己敲一遍运行,看看结果和你预想的是不是一样。
今天我们从安装导入开始,学习了创建时间对象、时区转换、时间加减、格式化和人性化输出这几个核心功能。pendulum还有很多实用细节,比如时间比较、时间段迭代、日期边界判断等,大家可以慢慢探索。用它处理时间,代码不仅写得快,还不容易出错,开发效率提升非常明显。
小伙伴们,今天的Python学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,Python学习节节高!