python pendulum
# 聊聊 Pendulum一个让 Python 时间处理不再头疼的库处理时间日期大概是每个 Python 开发者都绕不开的“小麻烦”。标准库的datetime模块功能是齐全但用起来总觉得有些别扭。比如时区转换比如时间差计算代码写着写着就容易变得啰嗦还容易出错。后来发现了 Pendulum 这个库用了一段时间感觉像是给 Python 的时间处理能力做了一次平滑升级。它是什么简单说Pendulum 是一个第三方的时间日期库。它的目标很明确在 Python 内置datetime模块的基础上提供一个更直观、更符合人类思维习惯的接口。它不是要彻底取代datetime而是作为一个“增强版”的替代品。底层很多地方和datetime是兼容的但它在易用性和功能上做了大量扩展。你可以把它想象成一把更趁手的螺丝刀。标准库的那把能用但 Pendulum 这把多了磁吸头、可伸缩杆、各种规格的批头干起活来顺手多了。它能做什么Pendulum 能干的事情核心都围绕着“让时间处理更简单”这个主题。首先是时区处理这是它的强项。datetime里处理时区尤其是本地时区和带时区信息的aware datetime对象步骤比较繁琐。Pendulum 则默认创建的就是带时区的时间对象默认是 UTC并且时区转换的语法非常直观就像直接给时间“贴上”另一个时区的标签一样自然。其次是时间运算和解析。计算“下个周一”、“三个月后的最后一天”这类需求用 Pendulum 几乎可以像读句子一样写出来。它对于各种字符串格式的时间解析也非常智能很多非标准格式它也能猜个八九不离十减少了手动指定格式的麻烦。它还提供了更丰富的时间差Period和时长Duration表示处理起“两个时间点之间到底隔了几年几月几天”这类问题特别方便。另外像本地化国际化显示比如把日期格式化成“刚刚”、“2天前”这种对人类友好的形式它也内置了支持。怎么使用安装很简单pip install pendulum就行。使用上大部分时候你只需要用pendulum模块替换掉from datetime import datetime这个习惯。创建一个时间对象可以直接用pendulum.now()获取当前时间带时区或者用pendulum.datetime(2023, 5, 10, tzAsia/Shanghai)来指定一个时间。你会发现创建时就可以直接指定时区非常直接。时区转换是家常便饭代码写出来大概是这样的beijing_timependulum.now(Asia/Shanghai)new_york_timebeijing_time.in_timezone(America/New_York)一句in_timezone意思清清楚楚。时间运算的写法也很可读。想知道 2023 年圣诞节后的第一个工作日是几号可以这样pendulum.datetime(2023,12,25).add(days1).next(pendulum.MONDAY)链式调用逻辑一目了然。解析字符串时间也省心pendulum.parse(2023-05-10 14:30)基本就能搞定甚至parse(last sunday)这种相对描述它也能理解。格式化输出时除了标准的格式符还能用类似dddd表示完整的星期几并且方便地转换成“多久以前”的友好格式。一些实践中的体会在实际项目里用 Pendulum有几个小地方感觉特别受用。一个是尽量在项目的入口处比如读取配置、接收 API 参数的时候就统一用pendulum.parse把各种字符串时间转换成 Pendulum 的DateTime对象。在内部处理逻辑中全部使用这个对象进行运算、比较。等到最后要输出、存数据库或者返回给前端时再按要求格式化成字符串或其它格式。这个“中间对象统一”的原则能避免很多时区混淆和类型不一致的坑。另一个是关于性能。对于超高性能敏感、每秒要处理海量时间运算的场景Pendulum 因为功能更复杂开销会比纯datetime稍大一点。但在绝大多数 Web 应用、数据分析、自动化脚本中这点开销完全值得因为它换来了代码的清晰和可维护性。开发效率的提升远比那点微小的性能差异重要。和数据库打交道时需要注意ORM比如 SQLAlchemy通常与标准的datetime对象耦合更紧。虽然 Pendulum 对象在很多情况下可以无缝当作datetime用但在定义模型字段类型时可能还是需要声明为标准的DateTime类型。存入和取出后再在业务逻辑层用 Pendulum 包装或处理这样兼容性最好。和同类工具的对比提到时间处理库除了标准库可能还会想到dateutil或者arrow。dateutil是个功能强大的工具箱特别擅长解析各种古怪的时间字符串时区支持也很好。但它更像是一套附加在datetime上的扩展函数没有提供一个像 Pendulum 这样统一的、增强的对象模型。用dateutil时你操作的核心可能还是那个原生的datetime对象。arrow的设计理念和 Pendulum 很接近也是提供一个更友好的 API 来包装时间日期。有一段时间arrow也很流行。不过从社区的活跃度和后续发展来看Pendulum 似乎更受青睐一些。两者在基础功能上差别不大但 Pendulum 在时间运算的语法上可能更灵活一点比如对“下个月”、“去年”这种相对时间的表达支持得更细致。另外Pendulum 对国际化i18n的支持是内置的而arrow可能需要额外配置。选择哪个有时候是个人喜好问题。但如果你已经受够了原生datetime的繁琐想找一个功能全面、接口现代、社区活跃的替代品Pendulum 目前是一个非常可靠的选择。它让处理时间这件事从一项必须小心翼翼的任务变得有点接近直觉了。代码写出来自己也更容易看懂隔几个月回头改也不容易发懵。这大概就是一个好工具最大的价值。