Pendulum。
https://github.com/sdispater/pendulum
Pendulum 是一个功能强大的库,用于处理日期、时间和时区。
它提供了直观且富有表现力的 API,用于操作、格式化和计算日期和时间之间的差异。
为什么 Pendulum 如此受欢迎?
-
直观的 API:Pendulum 提供了直观且用户友好的 API,通常被认为比内置的日期时间模块更方便且更具表现力。它提供了多种方法和属性来操作、格式化和计算日期和时间之间的差异。
-
时区支持:正确处理时区可能具有挑战性,但 Pendulum 简化了这项任务。它内置了对时区的支持,包括自动处理夏令时转换和不同时区之间的转换。Pendulum 使用 IANA 时区数据库,该数据库提供全面且最新的时区信息。
-
丰富的功能:Pendulum 提供了一组丰富的功能,超出了标准日期时间模块提供的功能。它包括日期和时间算术、相对时间表示、持续时间计算、字符串日期解析等方法。此功能集使你可以更轻松地在各种场景中处理日期、时间和时区。
-
人类可读的输出:Pendulum 允许你以人类可读的方式格式化日期和时间。
-
与现有代码的兼容性:Pendulum 被设计为 datetime 模块的直接替代品。它提供了类似的界面,这意味着你可以轻松地从使用 datetime 切换到使用 Pendulum,而无需进行大量代码修改。这种兼容性使其对那些想要增强现有代码库而无需进行重大重构的开发人员很有吸引力。
初体验
库的安装
我们可以通过运行以下命令安装它。目前支持 Python 3.8 及更高版本。
pip install pendulum
时区
Pendulum 库最令人印象深刻的功能是时区。
这也是内置 datetime 模块的关键问题之一。在 Python 3.9 之前,如果我们想使用 IANA 时区,就必须涉及 pytz 。
使用 Pendulum 库,我们可以轻松创建带有时区的日期时间对象。
import pendulum as pdl
dt_shanghai = pdl.datetime(2023, 9, 20, tz='Asia/Shanghai')
dt_america = pdl.datetime(2023, 9, 20, tz='America/Indiana/Indianapolis')
print(dt_shanghai)
print(dt_america)
在上面的例子中,我们同时创建了两个对象。但是,时区不同。Pendulum 还可以让我们轻松比较时间。
dt_shanghai.diff(dt_america).in_hours()
这是多么容易啊!比较两个具有不同时区的日期时间对象并获得准确的结果!
日期时间解析
解析日期时间可能是编程中最常见的用例。
Python 的 datetime 模块在这方面做得很好。然而,与大多数其他编程语言相比,Python 使用不同的格式 "%Y%m%d"。
Pendulum 允许我们使用如下通用格式代码。
pdl.from_format('2023-09-20 10:00:00', 'YYYY-MM-DD HH:mm:ss')
Pendulum 还支持更多动态格式。例如,仅包含数字的日期时间。
pdl.parse('20211106')
还可以指定年份、周数和该周的日期,Pendulum 会给你正确的日期时间。
pdl.parse('2021-W44-6')
字符串格式化
将字符串解析为日期时间对象后,下一个重要的事情是将日期时间输出为具体格式的字符串。
首先,我们有一个日期时间对象。由于 Pendulum 继承了Python datetime,所以我们可以使用 now() 等所有方法。
dt = pdl.now()
然后,让我从 Pendulum 中选取几个转字符串方法的示例,看看使用开箱即用的格式输出日期时间是多么容易。
dt.to_date_string() # 仅包含日期
dt.to_time_string() # 仅包含时间
dt.to_formatted_date_string() # 月份缩写日期、年份
dt.to_day_datetime_string() # 日、月份缩写日期、年份 hh:mm am/pm
dt.to_iso8601_string() # 符合 ISO 9601 标准
dt.to_atom_string() # 符合 Atom 格式
dt.to_cookie_string() # 符合 cookie 风格格式
当然,我们可以使用格式代码来自定义输出字符串,而且格式代码更加直观。
dt.format('DD MMMM, YYYY dddd HH:mm:ss A')
另一个很酷的东西是我们可以轻松地将一些不相关的字符串添加到格式字符串中并让它们从格式中转义。
dt.format('[Hi! Today is] DD MMMM, YYYY dddd HH:mm:ss A')
友好的可读性
在内置的 Python datetime 模块中,timedelta 工具可以很好地完成比较工作。
然而,Pendulum 甚至可以通过在比较两个日期时间对象时提供一些更人性化的输出来改进它。
例如,方法 diff_for_humans() 会将日期时间对象与当前时间进行比较,并返回非常人性化的输出。
dt1 = pdl.datetime(2021, 1, 1)
dt2 = pdl.datetime(2021, 11, 7, 1)
dt2.diff_for_humans(dt1)
查找相对日期时间
内置 Python 日期时间可以改进的方面之一是根据给定的日期时间查找相对日期时间。
例如,当我们想要查找当前月份的最后一天时,我们必须使用 datetutil 模块中的 relativedelta。
from dateutil.relativedelta import relativedelta
import datetime
datetime.datetime(2013, 2, 21) + relativedelta(day=31)
另外,代码的可读性不太好,因为我们使用 day=31 作为参数,尽管当月份少于 31 天时它会起作用。
在 Pendulum 中,这再简单不过了。
pdl.now().start_of('day')
pdl.now().start_of('month')
pdl.now().end_of('day')
pdl.now().end_of('month')
内置日期时间模块的另一个不便之处是查找一周中的某一天。
例如,如果我们想查找下周一的日期,这可能是最简单的方法。
from datetime import datetime, timedelta
datetime.now() + timedelta(days=(0-datetime.now().weekday()+7)%7)
它可以完成工作,但可读性很差。开发人员需要花一些时间来理解这行代码的逻辑是什么。
有了 Pendulum,一切就这么简单。
pdl.now().next(pdl.MONDAY)
我们甚至不用考虑应该用 0 还是 1 来表示星期一,因为 Pendulum 使用枚举来表示星期一。
类似地,我们可以使用 previous() 方法来查找前一个星期二,如下所示。另外,我们可以通过设置参数 keep_time=True 来保留时间部分。
pdl.now().previous(pdl.TUESDAY)
pdl.now().previous(pdl.TUESDAY, keep_time=True)
Pendulum 是 Python datetime 模块的直接替代品。通过使用这个库,datetime 模块可以解决的许多问题,例如查找相对日期,现在可以轻松解决。更重要的是,Pendulum 提供了整洁干净的 API 来提高我们代码的可读性,并且这些解决方案更加直观。
来源—–小寒聊python