曾几何时,我们中的一个人(Lacey)盯了一个多小时的python文档中描述日期和时间格式化字符串的表格。当我试图编写从 API 中将日期时间字符串转换为Python datetime对象时,我很难理解其中的特定部分,因此我决定请求帮助。
有人问道:“为什么你不使用 dateutil 呢?”
读者,如果你没有从这个月的 Python 专栏中获得任何东西,只是学习到有比 datetime 的 strptime 更容易地将 datetime 字符串转换为 datetime 对象的方法,那么我们觉得就已经成功了。
但是,除了将字符串转换为更有用的 Python 对象之外,还有许多库都有一些有用的方法和工具,可以让您更轻松地进行时间测试、将时间转换为不同的时区、以人类可读的格式传递时间信息,等等。如果这是你在 Python 中第一次接触日期和时间,请暂停并阅读如何使Python的日期和时间 。要理解为什么在编程中处理日期和时间是困难的,请阅读 《愚蠢的程序员相信时间》
随意跳过那些你已经熟悉的库,专注于那些对你而言是新的库。
内建的 datetime 模块
在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象。
假设我们从 API 接受到一个日期字符串,并且需要它作为 Python datetime 对象存在:

 22018-11-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。
为了得出这些结论,需要在Python 文档的表格中多加注意。
由于字符串中的 Z 表示此日期时间字符串采用 UTC,所以我们可以在格式中忽略此项。(现在,我们不会担心时区。)
转换的代码是这样的:

1 4$ from datetime import datetime
2 $ datetime.strptime('2018-11-29T17:45:25Z', '%Y-%m-%dT%H:%M:%SZ')
3 datetime.datetime(2018, 11, 29, 17, 45, 25)

格式字符串很难阅读和理解。我必须手动计算原始字符串中的字母 T 和 “Z”的位置,以及标点符号和格式化字符串,如 %S 和 %m。有些不太了解 datetime 的人阅读我的代码可能会发现它很难理解,尽管其含义已有文档记载,但它仍然很难阅读。
让我们看看其他库是如何处理这种转换的。
Dateutil
dateutil 模块对 datetime 模块做了一些扩展。
继续使用上面的解析示例,使用 dateutil 实现相同的结果要简单得多:

4$ from dateutil.parser import parse
$ parse('2018-11-29T17:45:25Z')
datetime.datetime(2018, 11, 29, 17, 45, 25, tzinfo=tzutc())

如果字符串包含时区,那么 dateutil 解析器会自动返回字符串的时区。由于我们在 UTC 时区,你可以看到返回来一个 datetime 对象。如果你想解析完全忽略时区信息并返回原生的 datetime 对象,你可以传递 ignoretz=True 来解析,如下所示:

1 4$ from dateutil.parser import parse
2 $ parse('2018-11-29T17:45:25Z', ignoretz=True)
3 datetime.datetime(2018, 11, 29, 17, 45, 25)

dateutil 还可以解析其他人类可读的日期字符串:

1 3$ parse('November 29th, 2018 at 5:45 pm')
2 datetime.datetime(2018, 11, 29, 17, 45)

dateutil 还提供了像 relativedelta 的工具,它用于计算两个日期时间之间的时间差或向日期时间添加或删除时间,rrule 创建重复日期时间,tz 用于解决时区以及其他工具。
Arrow
Arrow 是另一个库,其目标是操作、格式化,以及处理对人类更友好的日期和时间。它包含 dateutil,根据其文档,它旨在“帮助你使用更少的包导入和更少的代码来处理日期和时间”。
要返回我们的解析示例,下面介绍如何使用 Arrow 将日期字符串转换为 Arrow 的 datetime 类的实例:

1 4$ import arrow
2 $ arrow.get('2018-11-29T17:45:25Z')
3 <Arrow [2018-11-29T17:45:25+00:00]>

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

1 3$ arrow.get('2018-11-29T17:45:25Z').datetime
2 datetime.datetime(2018, 11, 29, 17, 45, 25, tzinfo=tzutc())

通过 Arrow datetime 类的实例,你可以访问 Arrow 的其他有用方法。例如,它的 humanize() 方法将日期时间翻译成人类可读的短语,就像这样:

1 5$ import arrow
2 $ utc = arrow.utcnow()
3 $ utc.humanize()
4 'seconds ago'

在 Arrow 的文档中关于其有用方法的信息。
Moment
Moment 的作者认为它是“内部测试版”,但即使它处于早期阶段,它也是非常受欢迎的,我们想来讨论它。
Moment 的方法将字符转换为其他更有用的东西很简单,类似于我们之前提到的库:

1 4$ import moment
2 $ moment.date('2018-11-29T17:45:25Z')
3 <Moment(2018-11-29T17:45:25)>

就像其他库一样,它最初返回它自己的 datetime 类的实例,要返回 Python datetime 对象,添加额外的 date() 调用即可。

1 3$ moment.date('2018-11-29T17:45:25Z').date
2 datetime.datetime(2018, 11, 29, 17, 45, 25, tzinfo=<StaticTzInfo 'Z'>)

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

1 3$ moment.date("tomorrow")
2 <Moment(2018-11-06T11:24:42)>

它的 add() 和 subtract() 命令使用关键字参数来简化日期的操作。为了获得后天,Moment 会使用下面的代码:

1 3$ moment.date("tomorrow").add(days=1)
2 <Moment(2018-11-07T11:26:48)>

Maya
Maya 包含了 Python 中其他流行处理日期时间的库,包括 Humanize、 pytz 和 pendulum 等等。这个项目旨在让人们更容易处理日期。
Maya 的 README 包含几个有用的实例。以下是如何使用 Maya 来重新处理以前的解析示例:

1 4$ import maya
2 $ maya.parse('2018-11-29T17:45:25Z').datetime()
3 datetime.datetime(2018, 11, 29, 17, 45, 25, tzinfo=<UTC>)

注意我们必须在 maya.parse() 之后调用 datetime()。如果我们跳过这一步,Maya 将会返回一个 MayaDT 类的示例:。
由于 Maya 与 datetime 库中很多有用的方法重叠,因此它可以使用 MayaDT 类的实例执行诸如使用 slang_time() 方法将时间偏移量转换为纯文本语言,并将日期时间间隔保存在单个类的实例中。以下是如何使用 Maya 将日期时间表示为人类可读的短语:

1 4$ import maya
2 $ maya.parse('2018-11-29T17:45:25Z').slang_time()
3 '23 days from now

显然,slang_time() 的输出将根据距离 datetime 对象相对较近或较远的距离而变化。
Delorean
Delorean,以 《返回未来》 电影中的时间旅行汽车命名,它对于操纵日期时间特别有用,包括将日期时间转换为其他时区并添加或减去时间。
Delorean 需要有效的 Python datetime 对象才能工作,所以如果你需要使用时间字符串,最好将其与上述库中的一个配合使用。例如,将 Maya 与 Delorean 一起使用:

1 3$ import maya
2 $ d_t = maya.parse('2018-11-29T17:45:25Z').datetime()

现在,你有了一个 datetime 对象 d_t,你可以使用 Delorean 来做一些事情,例如将日期时间转换为美国东部时区:

1 7$ from delorean import Delorean
2 $ d = Delorean(d_t)
3 $ d
4 Delorean(datetime=datetime.datetime(2018, 11, 29, 17, 45, 25), timezone='UTC')
5 $ d.shift('US/Eastern')
6 Delorean(datetime=datetime.datetime(2018, 11, 29, 13, 45, 25), timezone='US/Eastern')

看到小时是怎样从 17 变成 13 了吗?
你也可以使用自然语言方法来操作 datetime 对象。获取 2018 年 4 月 29 日之后的下个星期五(我们现在使用的):

1 3$ d.next_friday()
2 Delorean(datetime=datetime.datetime(2018, 5, 4, 13, 45, 25), timezone='US/Eastern')

在 Delorean 的文档中关于其的用法。
Freezegun
Freezegun 是一个可以帮助你在 Python 代码中测试特定日期的库。使用 @freeze_time 装饰器,你可以为测试用例设置特定的日期和时间,并且所有对 datetime.datetime.now()、 datetime.datetime.utcnow() 等的调用都将返回你指定的日期和时间。例如:

1 7from freezegun import freeze_time
2 import datetime
3
4 @freeze_time("2017-11-14")
5 def test():
6  assert datetime.datetime.now() == datetime.datetime(2017, 11, 14)

要跨时区进行测试,你可以将 tz_offset 参数传递给装饰器。freeze_time 装饰器也接受更简单的口语化日期,例如
@freeze_time(‘April 4, 2017’)。
上面提到的每个库都提供了一组不同的特性和功能,也许很难决定哪一个最适合你的需要。Maya 的作者, Kenneth Reitz 说到:“所有这些项目相辅相成,它们都是我们的朋友”。
这些库共享一些功能,但不是全部。有些擅长时间操作,有些擅长解析,但它们都有共同的目标,即让你对日期和时间的工作更轻松。下次你发现自己对 Python 的内置 datetime 模块感到沮丧,我们希望你可以选择其中的一个库进行试验。

Python 的6个日期时间库相关推荐

  1. netflix linux_Netflix如何处理故障转移,Anaconda,Linux命令行技巧,Python日期时间库,GDPR,微服务等

    netflix linux 上周,Amjith Ramanujam的页面浏览量超过12,000, 关于Netflix如何在7分钟内完成故障转移的文章是我们失控的热门. 您是否有关于您的组织如何确保最大 ...

  2. Python将字符串转换为日期时间

    In this tutorial, we'll see how to convert string to datetime in python. 在本教程中,我们将看到如何在python中将字符串转换 ...

  3. java日期时间库-常用案例-不保留全分享

    java日期时间库-常用案例-不保留全分享 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使 ...

  4. Python处理ISO 8601日期时间

    文章目录 一.ISO 8601日期时间 1. 简介 2. 格式 3. 时区划分 二.Python处理ISO 8601日期时间 1. 将 ISO 8601 转化为 UTC 标准日期时间 / 本地时间 2 ...

  5. C++ Boost库:日期时间库 date_time

    文章目录 1. 简介 2. 基本使用 3. date_period类 4. ptime类 5. time_period类 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 l ...

  6. Python中的对日期时间的处理

    我们可以通过学习在Python中对日期时间的处理,可以在快速的完成工作,比如: 将日期时间作为日志信息的内容输入 计算某一个功能的执行时间 用日期命名一个文件的名称 记录或者展示文件的发布或修改时间 ...

  7. Day.js —— 一个轻量型的日期时间库 moment 的完美代替品

    对于日期时间处理,常见有moment.js luxon等库,然而这些库在个人看来有点大了,而平常人往往只用到其中个别功能,这就有点浪费,当然也可以抽取想要模块,但稍显繁琐.对于这种情况,我一般喜欢自己 ...

  8. 邮件发送时间怎么修改 python_使用python通过电子邮件发送日期时间

    我试图使用python脚本解析电子邮件的日期时间. 在我打开邮件时,邮件日期值如下所示... 1 2 3 4from: abcd@xyz.com to: def@xyz.com date: Tue, ...

  9. 深入学习 Java 8 全新日期时间库 java.time(五)

    基本概念我们已经大概的了解了,接下来我们就深入探讨一下时间日期的格式化.类库中 java.time.format 包中就是我们所需的一些概念,其中最主要也是用的最多的就是DateTimeFormatt ...

最新文章

  1. 第三次冲刺阶段第五天
  2. Jenkins 创建一个freestyle的Job
  3. jdk1.8_googleV3免费下载(API中文文档)
  4. 用实例分析H264 RTP payload
  5. oracle 31693,ORACLE expdp备份与ORA-31693、ORA-02354、ORA-01555
  6. 利用计算机测地震是计算机的什么,计算机在气象预报、地震探测、导弹卫星轨迹等方面的应用都属于( )...
  7. 自动驾驶模拟器Carla之python编程-(1)简介
  8. Docker基础知识:Containers,Namespace,CGroups
  9. linux java mysql 乱码_Linux下MySQL的字符集乱码问题总结
  10. 程序win10_只需3步!教你打造精简win10,去除系统自带程序,运行更快!
  11. 快手短视频解析去水印原理及源码,sign+盐签名算法,获得无水印播放地址
  12. 影创SDK☀️四、开发注意事项
  13. 新人如何快速熟悉一个新项目
  14. Java选择结构之switch
  15. 【JZOJ6354】最短路(tiring)
  16. Spring Boot 五种热部署方式
  17. csgo服务器显示指令,CSGO国服控制台怎么打开 CSGO国服指令代码大全
  18. uniapp自定义导航栏,手机顶部通知栏字体颜色修改
  19. verilog练习:hdlbits网站上的做题笔记(5)
  20. Centos7端口映射(云端最后别忘了在安全组开放80端口!!!!!!!!!)

热门文章

  1. linux常用系统命令
  2. 线框图(demo草图)制作的总结
  3. php中怎么连接数据库中的表,php 连接 excel表格数据库数据-php中如何将execl的数据导入到数据库中...
  4. 网上书店黑盒测试_网上书店系统测试计划书.doc
  5. 回调函数 相当于线程_Java中的回调机制,这篇给你整的明明白白的
  6. ALV输出的时候,输出字段内容前面的空格
  7. 【推荐】SAP关闭正在执行的缓慢的程序
  8. 限制oracle数据库表的输出记录条数
  9. AUTHORITY-CHECK常用事务代码
  10. “埃尼阿克”背后的6个女孩