做过后台开发或者经常和时间数据打交道的朋友,大概率都体会过被Python原生 datetime 模块支配的恐惧。
每次遇到需要处理跨时区的时间、计算两个日期的间隔,或者是把一串不规则的时间字符串转换成时间对象,脑子里都会冒出一堆繁琐的步骤。不仅要拉上 pytz 来处理时区,还得去查那本永远记不住的 strptime 格式化字典。一顿操作猛如虎,代码写出来又长又难看,关键是遇到夏令时还会莫名其妙地报错。
如果你早就受够了这些折磨,今天推荐的这个库——Pendulum,绝对能让你相见恨晚。它不仅完美向下兼容原生的 datetime,还用极其优雅的API设计,把时间处理变成了纯粹的享受。
核心处理流:告别多模块拼凑
在使用原生库时,解析时间、处理时区、计算时间差往往需要用到不同的模块(datetime, time, pytz, dateutil)。但在 Pendulum 里,所有的操作都在一条连贯的流水线上完成。整个流转逻辑非常清晰:
[外部杂乱的时间字符串 / 时间戳] │ ▼ (自动智能解析 parse) ──> 生成统一的 Pendulum 对象 │ ▼ (无痛切换时区 in_timezone) │ ▼ (直观的时间加减法 add/subtract) │ ▼ [标准化格式输出 / 拟人化自然语言输出]
为什么它能让你少掉头发?直接看代码
空口无凭,我们直接拿平时最让人头疼的几个场景来看看它到底有多好用。
1. 彻底解决时区转换噩梦
以前处理时区,你要先声明时区对象,再做 localize 或者 astimezone。在 Pendulum 里,时区就像是时间对象自带的一个普通属性,想切就切。
import pendulum# 获取当前时间,默认就是 UTC,也可以直接指定时区now_in_paris = pendulum.now('Europe/Paris')print("巴黎时间:", now_in_paris)# 转换到东京时间,只需要调用一个方法now_in_tokyo = now_in_paris.in_timezone('Asia/Tokyo')print("东京时间:", now_in_tokyo)# 直接构造一个带时区的时间对象,代码极简dt_shanghai = pendulum.datetime(2026, 7, 31, 22, 10, 34, tz='Asia/Shanghai')
2. 扔掉那本该死的格式化字典
你有多久没去查 %Y-%m-%d %H:%M:%S 这个字符串了?Pendulum 内置了极其强大的解析引擎,只要你给的字符串长得像个时间,它基本都能自己猜出来,连 ISO 8601 标准也能直接秒杀。
import pendulum# 各种乱七八糟的格式,直接 parse 就完事了dt1 = pendulum.parse('2026-07-31T22:10:34Z')print(dt1) dt2 = pendulum.parse('2026-07-31 22:10:34')print(dt2)# 如果遇到极度不规则的,可以开启非严格模式dt3 = pendulum.parse('31-07-2026', strict=False)print(dt3.year, dt3.month, dt3.day)
3. 直觉般的时间加减法
给当前时间加上1个月零3天再减去2个小时。原生的 timedelta 不支持按“月”和“年”来加减(因为每个月天数不一样),往往要借助第三方库。而用 Pendulum,你只需要像说话一样写代码:
import pendulumnow = pendulum.now()# 链式调用,逻辑极为丝滑future_date = ( now .add(months=1, days=3) .subtract(hours=2))print("计算后的时间:", future_date)# 如果想知道下个月的最后一天是几号,也是自带的方法last_day = future_date.end_of('month')print("月末时间:", last_day)
4. 最具灵魂的功能:把时间变成人话
在做前端展示或者日志输出时,我们经常需要把时间显示成“2小时前”、“3天后”这种自然语言形式。以前你要写一长串 if-else 去算时间差,现在只需要一个方法:
import pendulum# 甚至可以设置本地化语言,直接输出中文pendulum.set_locale('zh')past = pendulum.now().subtract(days=3)future = pendulum.now().add(hours=5)# 针对当前时间的自然语言描述print(past.diff_for_humans()) # 输出:3天前print(future.diff_for_humans()) # 输出:5小时后# 计算任意两个时间对象的相对语言描述print(past.diff_for_humans(future)) # 输出:3天前
总结
其实作为一个开发者,我们最核心的精力应该放在业务逻辑和算法架构上,而不是整天在时区边界和字符串解析上死磕。Pendulum 把时间操作的复杂度全部封装在了底层,把最优雅、最符合人类直觉的 API 暴露给了我们。
下次新开 Python 项目,记得第一时间执行 pip install pendulum,然后把原生 datetime 永远留在过去。相信我,用过一次之后,你就再也回不去了。
编辑:余文彬
审校:余雨馨