jdatetime:让 Python 原生支持波斯历

12 阅读2分钟

jdatetime:让 Python 原生支持波斯历

jdatetime 在 GitHub 上拿到了 388 个 Star。

这个库做的事情很单纯——把 Python 标准库的 datetime 搬到了波斯历(Jalali calendar)体系下。如果你正在做跟伊朗用户相关的系统,或者需要处理波斯历的日期转换,这玩意儿能省不少事。

1、这项目解决什么问题

Python 自带的 datetime 模块跑的是公历。但伊朗和阿富汗用的是波斯历,这套历法以春分为岁首,月份天数跟公历完全不同。

正文顶部截图

用 datetime 直接处理波斯历?不行。自己从头写一套日期转换逻辑?那得翻天文算法文献,还得处理闰年判断、月份边界这些坑。

jdatetime 的做法是:API 完全对齐 Python 标准库的 datetime,你原来怎么写 datetime,现在就怎么写 jdatetime。迁移成本几乎为零。

2、核心功能

README区域截图

首先是两个方向转换:

  • fromgregorian():把公历日期转成波斯历
  • togregorian():把波斯历日期转回公历

还有 isleap(),专门判断波斯历的闰年。波斯历的闰年规则比较特殊,每 33 年一个周期里有 8 个闰年,自己手写容易写错。

更实用的是 locale 支持。把 locale 设成 FA_LOCALEstrftime() 输出的月份和星期名称就直接是波斯文了:

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 不算多,但这类领域库本就是解决具体问题,不需要广撒网。需要的人遇到了,就是刚需。