0基础学Python之二十:日期和时间的处理(下)

Hi 大家好,我是王可乐,欢迎回到我们的零基础学 Python 课程。上一节课里,可乐为大家介绍了计算机中时间的表示方式,包括时间戳、结构体时间的概念,以及在 Python 中如何使用内置的 time 模块来表示、转换和格式化输出时间。

我们提到过,除了 time 模块,Python 中还有 datetime 和 calendar 两个常用的时间日期处理模块,今天可乐就带大家来了解一下这两个模块。

首先是 datetime 模块。这个模块提供了一整套面向对象的界面,可以用来表示、操作和计算日期和时间。关于面向对象的概念,可乐会留在以后的课程中再为大家讲解。在这里,你只需要把 datetime 模块理解成一个工具箱就可以了。接下来,可乐就从这个工具箱中挑选几样常用的工具给大家介绍一下。

总的来看,datetime 的工具箱可以分为三个功能区。第一部分包含 date, time 和 datetime 三种类型的工具;第二部分是 timedelta 类型,表示时间区间;最后,tzinfo 和 timezone 类型的工具可以用来表示时区信息。我们来看几个例子:

这种写法使得后续代码中都可以省去 datetime 模块名,能够让代码更加简洁。

我们回来看一下 today() 函数返回的东西,它是一个 datetime.date 类型的数据,我们也把它称作 date 对象。这个对象包含三个成员元素,分别是 2018 年,3 月以及 31 日。和上一节课讲到的结构体时间类似,date 对象也使用不同的成员元素来表示时间不同的部分,只是这里的 date 对象只包含了年月日,功能更加专一。

除了 today() 之外,还可以直接创建 date 对象。例如:

我们可以用 year, month, day 这样的关键字来访问 date 对象中的各个成员元素。例如:

此外,date 对象和 time 模块的结构体时间还可以互相转换。例如:

这里,我们从 date 对象生成了一个结构体时间对象。它的年月日等日期相关的字段和 date 对象一致,只是时、分、秒字段都为 0,夏令时字段则为 -1,表示未知。

类似的,也可以使用时间戳来生成 date 对象,例如:

我们看到,date 类型提供的 fromtimestamp() 函数,把时间戳转换成了一个 date 对象。

date 对象是一个非常简单的对象,它专注于提供日期相关的工具函数。常见的函数包括 weekday() 函数,返回该日期是星期几,其中 0 为星期一;isoweekday() 函数,返回该日期是 ISO 标准的星期几,此时 1 是星期一;和 time 模块类似的 strftime() 函数,可以将日期格式化成字符串,等等。

这里,可乐就不一一为大家演示了,大家可以自己试一下。

类似于 date 类型的这种组织方式,datetime 将时间相关的功能组织在 time 类型里,并且提供了一个 datetime 类型,它相当于 date 和 time 两个类型合二为一。我们来看一下例子:

和 date 对象类似,time 对象也提供了一些工具函数,例如 isoformat(), strftime() 等,专门用于对时间进行修改、表示;

另外,time 对象是可以包含时区信息的。这里,可乐也不一一为大家演示了,请大家课后查阅文档,多多练习哦。

实际上,datetime 模块的 date 和 time 两个类型较少被单独使用。datetime 模块还提供了一个叫做 datetime 的类型,它相当于 date 和 time 两个类型的结合体,即提供了日期的部分,也提供了时间的部分,因此更为常用。我们来看一下例子:

这里需要注意的是,一定要区分清楚 datetime 类型和 datetime 模块。

当我们使用 import datetime 来引入 datetime 模块时,后续代码中我们都要使用 datetime.date, datetime.time 或者 datatime.datetime 这样的写法来使用相应类型的工具箱;

而上述 from datetime import datetime 则只是引入了 datetime 模块中的 datetime 类型,这样引入之后,后续代码中我们只要用到 datetime,都是指 datetime 类型。

这里,我们使用 now() 方法创建了一个 datetime 类型的对象,它包含了当前的日期、时间。你可以使用 date 类型中的 year, month, day 等关键字访问其中的年月日,也可以使用 time 类型中的 hour, minute, second 等关键字来访问其中的时分秒。

此外,你还可以用 timetuple() 函数将它转换为结构体时间,或者用 fromtimestamp() 函数来将时间戳转换成 datetime 对象。这些都和 date, time 两个模块中的使用方法类似。事实上,datetime 类型提供了 date() 和 time() 两个函数,可以从 datetime 对象中抽取日期或者时间,转换成 date 或者 time 对象。

最后,datetime 类型也提供了和 time 模块中非常类似的 strftime() 和 strptime() 方法。如果你在代码中使用 datetime 类型,就可以直接使用这两个内置方法来输出格式化字符串,或者将字符串时间转换成 datetime 类型了。可乐建议大家在自己的 Python Shell 里体验一下,因为 datetime 类型同时包含了 date 和 time,所以它是一个非常常用的类型。

使用 datetime 模块还有一个好处,就是它直接支持日期的算术运算。例如,我们看一个例子:

这个 td 是个什么呢?大家可以想一下。两个时间点之差,应该是个时间段咯。

这里,timedelta 类型就是一个表示时间段的类型,可以用于时间的算术计算,例如上例的时间相减。我们说,如果用时间戳来表示时间,那么时间的算术运算就很简单了,两个时间点都是以秒为单位的数字,它们的差就也是一个数字。这个数字表示秒,除以 60 就表示分钟,再除以 60 就表示小时,等等。

而 timedelta 类型则比这个数字要易用很多,可以直接将时间段表示为天、秒、微秒等形式,我们来看一下:

可以看到,timedelta 类型包含了三个字段。其中 days 表示该时间段中包含多少个整天,

我们看到 2018 年 3 月 31 日 14 时 4 分 25 秒 995602 微秒比 2018 年 3 月 30 日 10 时 24 分 5 秒 12 微秒多出一个整天;而 seconds 表示除去 days 之后,剩余不足一整天的时间为多少秒,我们看到 d1 和 d2 之间除去一整天之外,d1 还比 d2 多出来 3 小时 40 分钟 20 秒,刚刚好 13220 秒;类似点 microseconds 字段则表示两个时间点只差不足一秒的部分差多少毫秒,也就是 995590。因此,timedelta 是有能力表示精确到毫秒的时间差的。

除了用日期相减得到时间段,我们还可以使用 datetime 的构造函数直接创造一个时间段。例如:

除了上面的 weeks, days 和 hours,还可以用 seconds, microseconds, milliseconds minutes 几个参数来精确地指定时间段的长度。

有了时间段的概念,我们就可以很容易地进行时间的运算,例如:

可以看到,加上一整天,就得到了明天的时间对象,这样使用起来非常自然。和上面 datetime, timedelta 等类型类似,datetime 模块还提供了 tzinfo 和 timezone 两个类型,用于时区相关信息的表示和操作。由于时间的限制,这部分的内容可乐就留给大家自己来探索了。

最后,可乐再为大家简单介绍一下 calendar 这个模块。顾名思义,这个模块为我们提供了很多关于日历操作的工具。例如:

如果你在编程过程中遇到了和日历相关的逻辑要实现,就可以查阅一下 calendar 这个模块,看看是不是有方便的接口可以帮助你快速实现。可乐也希望大家在课后能够查阅一下 calendar 模块的文档,对它提供了哪些功能有一个认识。

好了,今天的内容就到这里了。日期和时间的处理是编程中一个常见的话题,可乐用两节课的时间也只是为大家介绍了一个概要。希望大家在实际使用中多多查看文档,查看样例代码,这样就能够熟练地在 Python 中使用日期和时间了。

在下一节课里,可乐会开始另一个新的话题,Python 中的文件操作。我们说在计算机的世界里一切都是文件,能够读写操作文件确实是一个必不可少的技能呢,敬请期待哦。

好了,如果你喜欢我们的课程,欢迎关注我们的公众号“可乐编程”,同时也请转发给你的朋友们哦。可乐感谢大家的支持,我们下次课再见!

往期课程:

《0基础学Python之十九:日期和时间的处理(上)》

《0基础学Python之十八:再谈函数》

《0基础学Python之十七:集合》

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180510G1A0OV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券