
后端【免费下载链接】pendulumPython datetimes made easy项目地址https://gitcode.com/gh_mirrors/pe/pendulum点击查看免费下载Pendulum 是Python datetimes made easy这一理念的开源实现其 CHANGELOG.md 完整记录了从 2.0.02018 年到 3.2.02026 年的每一个重要节点。本文以该变更日志为脉络结合仓库源码Rust 扩展、Python 核心模块、测试与打包配置系统拆解 Pendulum 在 API 命名、时区系统、解析格式化、Duration/Interval 语义、国际化与测试基础设施上的演进逻辑帮助读者理解为什么现在的 API 长这样并为 2.x → 3.x 的升级迁移提供可落地的对照清单。版本速览八个主要版本的技术主线Pendulum 的版本史可以用几条主线概括API 语义收敛Pendulum→DateTime、Interval→Duration、Period→Interval、性能层重写C 扩展 → Rust/PyO3 扩展、时区栈换血pytz → 标准库zoneinfo、Python 版本支持策略收紧逐步淘汰 2.7/3.4–3.8拥抱 3.10–3.14以及国际化体系从自定义数据切换到 CLDR。版本发布时间关键里程碑2.0.02018-05-08API 大重构Pendulum→DateTimeInterval→Duration引入年/月级 Duration、ISO 8601 时长与区间解析、CLDR 本地化、local()/naive()辅助函数2.1.02020-03-07完整类型标注与 PEP-561 合规is_anniversary()多个时区过渡与from_format()修复2.1.12020-07-13from_format()时区匹配、负 timedelta 相减、DST 过渡期now()等修复3.0.0a12022-11-23放弃 Python 2.7/3.5/3.6Timezone改用zoneinfo.ZoneInfoPeriod→Interval新时间旅行测试辅助3.0.0b12023-10-01扩展层全面改写为 RustPyO3instance()支持全部原生类型DST 下start_of()/end_of()修复3.0.02023-12-16依赖约束放宽测试辅助改为testextra 可选安装week_of_month边界修复3.1.02025-04-19支持 Python 3.13、移除 3.8UA/BG 语言包timezones()改用系统 tzdata3.2.02026-01-30支持 Python 3.14PyPy 下限提升到 3.11移除pytz依赖PyO3 升级 0.27HI 语言包从打包配置看当前版本由 pyproject.toml 声明requires-python 3.10classifiers 覆盖 Python 3.10–3.14运行时依赖仅剩python-dateutil与tzdata两项与移除 pytz、拥抱标准库 zoneinfo的演进方向完全一致。架构里程碑扩展层从 C 到 Rust 的重写PyO3 与 maturin 构建体系3.0.0b1 起Pendulum 的性能敏感代码从 C 扩展迁移到 Rust通过 rust/Cargo.toml 中的pyo3 0.27与cdylibcrate 类型构建模块名为_pendulum。构建后端在 pyproject.toml 中指定为maturin并在[tool.maturin]段声明module-name pendulum._pendulum。Rust 侧代码按职责拆分在 rust/src 下parsing.rsISO 8601 解析核心helpers.rs与python/helpers.rs通用辅助逻辑python/types/duration.rs、python/types/precise_diff.rs、python/types/timezone.rs与 Python 层Duration、precise_diff、FixedTimezone对应的加速实现见 rust/src/python/types/mod.rs。3.2.0 中Fixed incorrect date offset calculation in Rust extensionsPR #918正是对这套 Rust 扩展的日期偏移计算修正PyO3 升级到 0.27PR #922则保证了新工具链下的 ABI 兼容与稳定性。在纯 Python 环境如 PyPy下Pendulum 仍提供等价实现兜底这一点也体现在 3.1.0 对pure Python wheels的专门修复PR #889上。从源码看 Duration 的直观归一化Rust 扩展与 Python 层职责互补。以 src/pendulum/duration.py 的Duration.__new__为例它通过timedelta.__new__(..., days years * 365 months * 30, ...)兼容原生timedelta的构造方式再基于total_seconds()反推weeks/remaining_days/hours/minutes等直观单位实现了 2.0.0 引入的年/月级 Duration语义pendulum.duration(years1, months2)会被拆解为_years、_months与剩余的天、时、分、秒分量。这正是替换标准 timedelta 但提供更直觉化属性的底层机制。API 语义收敛两次重要的类名更名CHANGELOG 中记录了两轮影响深远的更名理解它们对排查旧代码至关重要2.0.0Pendulum类更名为DateTimeInterval类更名为Duration并移除了create()、utcnow()辅助函数strict关键字参数更名为exact。3.0.0a1Period类更名为Intervalperiod辅助函数更名为interval同时移除旧测试辅助test()与set_test_now()。在 src/pendulum/init.py 的__all__中可以看到收敛后的最终形态DateTime、Date、Time、Duration、Interval五大核心类型配合datetime、date、time、duration、interval、instance、parse、now等函数式入口。2.0.0 还记录了属性的方法化改造local、utc、is_dst从属性变为is_local()、is_utc()、is_dst()方法。另一个语义统一点是 3.0.0b1 的day of week convention 全代码库一致化PR #731——配合 src/pendulum/day.py 中的WeekDay枚举与 src/pendulum/init.py 导出的MONDAY~SUNDAY常量星期语义在Date/DateTime各修饰方法中保持一致。时区系统的三次换血CHANGELOG 揭示了 Pendulum 时区栈的完整演进早期2.0.x自研 TZ 数据文件读取localtime/clock文件CHANGELOG 中反复出现修复某些系统读取 clock 文件/时区文件失败的条目2.0.2、2.0.3、2.0.5。3.0.0a1PR #569Timezone类改为依托标准库zoneinfo.ZoneInfo从根本上告别自维护时区数据。3.2.0彻底移除pytz依赖PR #9113.1.0 修复pendulum.tz.timezones()改用系统 tzdataPR #8013.2.0 用pathlib读取 Unix TZ 数据PR #742。当前实现集中在 src/pendulum/tz 目录timezone.py定义Timezone与FixedTimezonelocal_timezone.py负责本地时区探测windows.py处理 Windows 时区映射。同时 src/pendulum/init.py 的timezone()入口支持字符串 IANA 名称Timezone、整数固定偏移FixedTimezone与UTC三种形态_safe_timezone()src/pendulum/init.py还能把zoneinfo、pytz风格的 tzinfo 对象归一化处理——这是 3.x 后同时兼容新旧生态的兼容层证据。与 2.1.1修复 DST 过渡期now()返回错误结果、3.0.0b1修复 DST 下start_of()/end_of()PR #713等条目呼应时区修复一直是变更日志的高频主题也印证了 Pendulum 在处理跳过时间skipped time、重复时间fold 属性等 DST 边界上的持续投入。解析与格式化高频修复区CHANGELOG 中解析格式化相关条目最多值得使用者重点关注的几类from_format()严格性2.0.4/2.1.0/2.1.1 连续修复转义元素不被识别2.0.4、接受多余文本PR #372、非法时区被匹配PR #3742.0.5 修复 ISO 周日期解析、2.0.4 增加xtoken 与两位数日期支持。parse()行为3.2.0 修复pendulum.parse(now, tz...)忽略时区参数PR #701与parse未标记为导出PR #6932.0.0 起exact默认关闭不再回退到dateutil宽松解析。ISO 8601 时长/区间2.0.0 引入 ISO 8601 时长与区间解析3.1.0/3.2.0 修复非法区间字符串解析PR #843、PR #8603.2.0 修复纯 Python 实现中空Duration未报错的问题PR #903。相关实现见 src/pendulum/parsing/iso8601.py其中parse_iso8601最终通过Duration(years..., months..., weeks..., ...)构造返回src/pendulum/parsing/iso8601.py与 Rust 侧parsing.rs形成双实现。3.2.0 的优化re.方法使用PR #741与locales 和 pytest 改为懒加载PR #926属于性能与启动开销优化——后者在 src/pendulum/init.py 中有直接体现Traveller通过cache惰性导入避免未使用测试功能时强制加载 pytest。Duration 与 Interval 的深度修复史Duration继承timedelta与Interval继承Duration是 Pendulum 的核心价值之一CHANGELOG 记录了它们的大量边界修复分量正确性2.1.1 修复含年/月的total_units()计算错误PR #4822.0.2 修复负Period的weeks属性3.0.0 修复添加时长时小时与天处理错误PR #775。拷贝语义3.0.0 修复深拷贝DateTime时fold属性丢失PR #7763.2.0 修复Interval深拷贝PR #850与Duration深拷贝漏掉 weeksPR #933。输出与比较2.1.0 起空Duration的in_words()返回0 milliseconds3.2.0 修复in_words()的复数化 bugPR #8262.1.0 修复Period与timedelta等的比较问题PR #427。in_words()的本地化输出逻辑见 src/pendulum/duration.py按 year→month→week→day→hour→minute→second 顺序组装通过pendulum.locale(locale)获取翻译并用复数规则选择词形空时长则回退到秒/微秒表述。Interval的构造则在 src/pendulum/interval.py 中校验 start/end 类型一致性与 naive/aware 混用并支持absoluteTrue自动交换起止点。国际化CLDR 驱动的 locale 体系2.0.0 起 Pendulum 采用基于 CLDR 数据的新本地化系统CHANGELOG 中每个版本都伴随 locale 新增或修正新增语言包sk/ja/he/sv3.0.0a1、nl/it/id/nb/nn2.1.0、pl2.1.1、ru2.0.5、ua/bg3.1.0、hi3.2.0。翻译修正3.1.0 修复韩语before/after翻译PR #858、修正 Kyiv 拼写PR #885。每个 locale 在 src/pendulum/locales 下由两个文件组成locale.pyCLDR 数据自动生成不可手改与custom.pyCLDR 未覆盖的 Pendulum 自定义数据。in_words()、diff_for_humans()等人类可读输出正是通过这套体系完成多语言化测试覆盖在 tests/localization 目录中逐语言验证。测试基础设施从内置辅助到时间旅行3.0.0a1 引入新的时间旅行测试辅助PR #626同时移除旧test()/set_test_now()3.0.0 起这些辅助改为通过testextra 可选安装PR #778依赖约束为 pyproject.toml 中的time-machine3.0.0,4.0.0PyPy 除外3.2.0 为time-machine增加了上限PR #931。当前入口定义在 src/pendulum/testing/traveller.py公开 API 为freeze、travel、travel_to、travel_back在 src/pendulum/init.py 中通过_traveller()懒加载导出对应测试见 tests/testing/test_time_travel.py。这一设计使得测试代码可以在不依赖全局状态的前提下模拟任意时刻配合 tests/fixtures/tz 中的时区夹具验证 DST 等边界行为。兼容性与升级要点2.x → 3.x 对照清单综合 CHANGELOG 的 breaking changes从 2.x 升级到 3.x 需要关注类名Pendulum→DateTime2.0.0、Interval(旧时长)→Duration2.0.0、Period→Interval3.0.0a1注意同名不同义。辅助函数period()→interval()create()/utcnow()已删除strict参数改名exact且默认关闭 dateutil 回退。属性→方法is_local()、is_utc()、is_dst()不再是属性。测试 APItest()/set_test_now()移除改用freeze/travel/travel_to/travel_back且需安装pendulum[test]。Python 版本当前要求 3.10PyPy 3.11见 3.2.02.7/3.4–3.8 均已被移除。时区行为Timezone底层基于zoneinfo.ZoneInfopytz依赖已彻底移除依赖tzdata包提供系统缺失的时区数据。小结从 CHANGELOG.md 的条目密度可以看出Pendulum 的演进始终围绕三条主线把直觉化的日期时间 API打磨到极致Duration 单位拆分、diff_for_humans、in_words本地化、在性能与正确性之间反复校准Rust 扩展 大量 DST/时区修复、以及持续拥抱 Python 生态的现代标准zoneinfo、PEP-561、懒加载、可选的测试依赖。对使用者而言这份变更日志既是升级手册也是理解为什么 API 设计成现在这样的第一手资料。赞分享后端【免费下载链接】pendulumPython datetimes made easy项目地址https://gitcode.com/gh_mirrors/pe/pendulum点击查看免费下载相关推荐Ripple 运行时演进全解从 CHANGELOG 追溯 Ripple 框架的版本史与源码实证Ripple 运行时演进全解从 CHANGELOG 追溯 Ripple 框架的版本史与源码实证 packages/ripple/CHANGELOG.md 是前端Web框架SSRLuxon 3.x 版本演进全解析从 CHANGELOG 到源码的日期时间库升级指南Luxon 3.x 版本演进全解析从 CHANGELOG 到源码的日期时间库升级指南 Luxon 是一个面向 JavaScript 的日期与时间处理库采用不开发工具Emotion 版本演进全览从 CHANGELOG 透视 CSS-in-JS 库的架构与 API 变迁Emotion 版本演进全览从 CHANGELOG 透视 CSS in JS 库的架构与 API 变迁 Emotion 是一个面向高性能样式组合设计的 CSS前端上一篇agentic-awesome-skills 中的 AI Agents Architect自主智能体架构设计与安全落地的完整指南下一篇CANN/driver网络包统计查询创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考