在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。
-- Lacey Williams Hensche
致谢
编译自 | https://opensource.com/article/18/4/python-datetime-libraries
作者 | Lacey Williams Hensche
译者 | MjSeven 共计翻译:39篇 贡献时间:112 天
在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。
这篇文章是与Jeff Triplett
[1]
一起合写的。
曾几何时,我们中的一个人(Lacey)盯了一个多小时的Python 文档
[2]
中描述日期和时间格式化字符串的表格。当我试图编写从 API 中将日期时间字符串转换为Python datetime
[3]
对象时,我很难理解其中的特定部分,因此我决定请求帮助。
有人问道:“为什么你不使用 呢?”
读者,如果你没有从这个月的 Python 专栏中获得任何东西,只是学习到有比 datetime 的 更容易地将 datetime 字符串转换为 datetime 对象的方法,那么我们觉得就已经成功了。
但是,除了将字符串转换为更有用的 Python 对象之外,还有许多库都有一些有用的方法和工具,可以让您更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式传递时间信息,等等。如果这是你在 Python 中第一次接触日期和时间,请暂停并阅读如何使用 Python的日期和时间
[3]
。要理解为什么在编程中处理日期和时间是困难的,请阅读愚蠢的程序员相信时间
[4]
。
这篇文章将会向你介绍以下库:
◈Dateutil
[5]
◈Arrow
[6]
◈Moment
[7]
◈Maya
[8]
◈Delorean
[9]
◈Freezegun
[10]
随意跳过那些你已经熟悉的库,专注于那些对你而言是新的库。
内建的 datetime 模块
在跳转到其他库之前,让我们回顾一下如何使用 模块将日期字符串转换为 Python datetime 对象。
假设我们从 API 接受到一个日期字符串,并且需要它作为 Python datetime 对象存在:
这个字符串包括:
◈ 日期是 格式的
◈ 字母 表示时间即将到来
◈ 时间是 格式的
◈ 表示此时间的时区指示符 采用 UTC (详细了解日期时间字符格式
[11]
)
要使用 模块将此字符串转换为 Python datetime 对象,你应该从 开始。 接受日期字符串和格式化字符并返回一个 Python datetime 对象。
我们必须手动将日期时间字符串的每个部分转换为 Python 的 可以理解的合适的格式化字符串。四位数年份由 表示,两位数月份是 ,两位数的日期是 。在 24 小时制中,小时是 ,分钟是 ,秒是 。
为了得出这些结论,需要在Python 文档
[2]
的表格中多加注意。
由于字符串中的 表示此日期时间字符串采用 UTC,所以我们可以在格式中忽略此项。(现在,我们不会担心时区。)
转换的代码是这样的:
格式字符串很难阅读和理解。我必须手动计算原始字符串中的字母 和 “Z”的位置,以及标点符号和格式化字符串,如 和 。有些不太了解 datetime 的人阅读我的代码可能会发现它很难理解,尽管其含义已有文档记载,但它仍然很难阅读。
让我们看看其他库是如何处理这种转换的。
Dateutil
dateutil 模块
[12]
对 模块做了一些扩展。
继续使用上面的解析示例,使用 实现相同的结果要简单得多:
如果字符串包含时区,那么 解析器会自动返回字符串的时区。由于我们在 UTC 时区,你可以看到返回来一个 datetime 对象。如果你想解析完全忽略时区信息并返回原生的 datetime 对象,你可以传递 来解析,如下所示:
还可以解析其他人类可读的日期字符串:
还提供了像relativedelta
[13]
的工具,它用于计算两个日期时间之间的时间差或向日期时间添加或删除时间,rrule
[14]
创建重复日期时间,tz
[15]
用于解决时区以及其他工具。
Arrow
Arrow
[16]
是另一个库,其目标是操作、格式化,以及处理对人类更友好的日期和时间。它包含 ,根据其文档
[17]
,它旨在“帮助你使用更少的包导入和更少的代码来处理日期和时间”。
要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例:
你也可以在 的第二个参数中指定格式,就像使用 一样,但是 Arrow 会尽力解析你给出的字符串, 返回 Arrow 的 类的一个实例。要使用 Arrow 来获取 Python datetime 对象,按照如下所示链式 datetime:
通过 Arrow datetime 类的实例,你可以访问 Arrow 的其他有用方法。例如,它的 方法将日期时间翻译成人类可读的短语,就像这样:
领取专属 10元无门槛券
私享最新 技术干货