58

最好用的 6 款 Python 的日期时间库

 5 years ago
source link: http://www.10tiao.com/html/605/201806/2654251699/2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!


写过Python程序的人都知道,Python日期和时间的处理非常繁琐和麻烦。


除了将字符串转换为更有用的 Python 对象之外,还有许多库具有一些有用的方法和工具,可以让你更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式输出时间信息,本文将介绍以下六个Python的时间日期库:

● Dateutil

● Arrow

● Moment

● Maya

● Delorean

● Freezegun



内建的 datetime 模块


在介绍其他库之前,让我们回顾以下如何使用datetime模块将日期字符串转换为Python日期时间对象。


假设我们从API接收到这个日期字符串,并且需要它作为Python datetime对象存在:

2018-04-29T17:45:25Z


该字符串包括:

● YYYY-MM-DD格式的日期

● 字母“T”表示即将到来的时间

● HH:II:SS的时间格式

● 指示此时间的时区指示符“Z”采用UTC


要使用该datetime模块将此字符串转换为Python datetime对象,你可以首先从strptime开始。datetime.strptime接收日期字符串和格式化字符并返回一个Python datetime对象。


我们必须手动将日期时间字符串的每个部分转换为Python datetime.strptime可以理解的格式化字符串。四位数的年份表示为%Y。两位数的月份是%m。两位数的日期是%d。24小时制的时间,%H表示小时数,分钟数用%M表示,秒用%S表示。


由于字符串中的“Z”表示此日期时间字符串采用UTC,所以我们可以在格式中忽略此项。


此转换的代码如下所示:



格式化字符串很难阅读和理解。有些人不太了解阅读datetime代码的人就会发现这很难理解,尽管其含义已有文档说明,但仍然很难阅读。


让我们看看其他库如何处理这种转换。



1、Dateutil


Dateutil模块为datetime模块提供了一些扩展,依然以上面的示例为例,实现相同的结果则要简单得多:



dateutil解析后可以自动返回字符串的时区。由于我们采用UTC,你可以看到返回了datetime对象。如果你想parse完全忽略时区信息,并返回一个原生的DateTime对象,你可以传递参数 ignoretz=True 给parse,像这样:



Dateutil还可以解析更多可读的日期字符串:



dateutil还提供了relativedelta,用于计算两个日期时间之间的时差或从日期时间添加/删除,rrule用于创建重复日期时间,tz用于处理时区以及其他工具。



2、Arrow


Arrow是另一个库,其目标是进行操作,格式化,并处理更合理的日期和时间。它包括dateutil模块,根据其文档描述Arrow旨在“帮助你使用更少的代码来处理日期和时间”。


要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例:



你也可以在第二个参数中指定get() 格式,就像使用strptime一样,Arrow会尽力解析你提供的字符串,get() 返回 Arrow 的 datetime 类的一个实例。要使用Arrow来获取 Python datetime对象,可以如下所示:



通过Arrow datetime类的实例,你还可以访问Arrow的其他有用方法。例如,它的humanize()方法将日期时间解析成可读的短语,如下所示:



你可以在Arrow文档中阅读更多有用的方法



3、Moment


Moment的创作者认为它是“测试版”,但即使它处于早期阶段,却非常受欢迎的,因此它出现在推荐名单内


Moment将字符串转换的方法很简单,类似于我们之前提到的库:



和其他库一样,它最初返回它自己的datetime类的实例。要返回Python datetime对象,请添加一个date()调用。


这会将Moment datetime类转换为Python日期时间对象。Moment还提供了使用人类可读语言创建新日期的方法。如为明天创建一个日期:



它add()和subtract()命令采取关键字参数,使日期的操作变得简单,以及为了获得后天的日期,Moment会使用下面的代码:




4、Maya


MAya包含了其他流行的库,诸如Humanize,pytz和pendulum等等。该项目的目标是让人们更容易处理日期。


Maya的README包含几个有用的示例。以下是如何使用Maya重现上面解析示例:



请注意,我们必须在.datetime()之后调用maya.parse()。如果我们跳过这一步,Maya将返回MayaDT类的一个实例:<MayaDT epoch=1525023925.0>


由于Maya有许多方法和datetime库中的一样,因此它可以使用其MayaDT类的实例来执行诸如使用slang_time()方法将timedeltas转换为纯文本语言,以及将日期时间间隔保存在单个类的实例操作中。以下是如何使用Maya将日期时间表示为人类可读的短语:



很显然,slang_time()的输出结果会根据你与datetime对象的距离长短而改变。



5、Delorean


Delorean以《Back to the Future》电影中的时间旅行汽车命名的,适用于操纵日期时间:将日期时间转换为其他时区,并添加或减去时间。


Delorean需要有效的Python Datetime才能执行,所以如果你需要使用日期时间字符串,最好将其与上述库中的一个配合使用。例如,将Maya与Delorean一起使用:



现在,在日期时间对象d_t可供您使用的情况下,你可以使用Delorean进行操作,例如将日期时间转换为美国东部时区:



你看小时数已经从17变为13了,你还可以使用自然语言方法来操作 datetime 对象。2018年4月29日之后的下个星期五(我们使用的日期):




6、Freezegun


Freezegun是一个可以帮助你在Python代码中测试特定日期的库。使用@freeze_time装饰器,你可以设置测试条件下的具体日期和时间,所有datetime.datetime.now(),datetime.datetime.utcnow()等都会返回你指定的日期和时间。例如:



要跨时区进行测试,可以将tz_offset参数传递给装饰器。该freeze_time装饰同样能够处理更通俗易懂的语言日期,例如@freeze_time('April 4, 2017')。


上面提到的每个库都有各自不同的功能。可能很难确定哪一个最适合你的需求。正如Maya的创作者 Kenneth Reitz说:“所有这些项目相互补充,它们都很友好。”


这些库各自都具备一些功能,但并不都是完美的。有些擅长时间操作,有些擅长解析。但他们都有共同的目标,即让时间日期相关的操作都变得简单。当你发现Python的内置datetime模块已经不够用的时候,你可以选择以上的某一个库尝试看看。


  • 来源:开源最前线

  • https://opensource.com/article/18/4/python-datetime-libraries

  • 程序员大咖整理发布,转载请联系作者获得授权

【点击成为源码大神】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK