jdatetime:让 Python 原生支持波斯历
jdatetime 在 GitHub 上拿到了 388 个 Star。
这个库做的事情很单纯——把 Python 标准库的 datetime 搬到了波斯历(Jalali calendar)体系下。如果你正在做跟伊朗用户相关的系统,或者需要处理波斯历的日期转换,这玩意儿能省不少事。
1、这项目解决什么问题
Python 自带的 datetime 模块跑的是公历。但伊朗和阿富汗用的是波斯历,这套历法以春分为岁首,月份天数跟公历完全不同。
用 datetime 直接处理波斯历?不行。自己从头写一套日期转换逻辑?那得翻天文算法文献,还得处理闰年判断、月份边界这些坑。
jdatetime 的做法是:API 完全对齐 Python 标准库的 datetime,你原来怎么写 datetime,现在就怎么写 jdatetime。迁移成本几乎为零。
2、核心功能
首先是两个方向转换:
fromgregorian():把公历日期转成波斯历togregorian():把波斯历日期转回公历
还有 isleap(),专门判断波斯历的闰年。波斯历的闰年规则比较特殊,每 33 年一个周期里有 8 个闰年,自己手写容易写错。
更实用的是 locale 支持。把 locale 设成 FA_LOCALE,strftime() 输出的月份和星期名称就直接是波斯文了:
import jdatetime
jdatetime.set_locale(jdatetime.FA_LOCALE)
print(jdatetime.datetime.now().strftime('%A %B'))
# 输出:دوشنبه خرداد
locale 设置支持按线程隔离,在多线程或 greenlet 环境里也不会互相干扰。同时也提供了 aslocale() 方法,可以在不改变全局设置的情况下,单独给某个实例切换语言。
3、上手体验
安装一行命令:
pip install jdatetime
用法跟标准 datetime 几乎一样:
>>> import jdatetime
>>> jdatetime.datetime.now()
jdatetime.datetime(1394, 12, 4, 8, 37, 31, 855729)
>>> jdatetime.date.today()
jdatetime.date(1394, 12, 4)
now() 和 today() 的返回值、方法签名和标准库完全一致。date、datetime、timedelta 这三个最常用的类型都覆盖了,日常开发需要的加减日期、格式化输出、日期比较这些操作,都不需要额外学习。
4、适合哪些人用
你的项目如果有伊朗用户,或者业务涉及波斯历的日期展示、节日计算、年龄逻辑,jdatetime 是一个直接可用的方案。没有重型依赖,安装体积小,也支持从 Python 3.7 到最新版本。
388 个 Star 不算多,但这类领域库本就是解决具体问题,不需要广撒网。需要的人遇到了,就是刚需。