Python的日期时间(datetime)

Python的日期时间(datetime)

在Python程序里,为了表示日期和时间,我们需要借助datetime模块。在这篇教程中,我们将把焦点放在该模块上,主要通过以下2个方面来学习Python中的日期和时间:

  • 使用datetime模块
  • 考虑时区



使用datetime模块

首先,让我们花一点时间来了解:datetime模块中都提供了哪些功能?

打开该模块所对应的datetime.py文件(如果你不知道这个文件在那里,那么你可以参考这篇文章来找到该文件),你会看到以下4个类型的定义:

  1. date,它表示日期,因此,它定义了年(year)、月(month)、日(day)
  2. time,它表示时间,因此,它定义了时(hour)、分(minute)、秒(second)、微秒(microsecond)、时区(tzinfo)
  3. datetime,它表示日期+时间,从逻辑概念上来说,它是datetime的合体,但是具体的实现确没有直接使用这2者的功能
  4. tzinfo,它表示时区,用于存储时区相关的信息

接下来,让我们看看如何使用它们,新建一个文件start.py,输入以下内容:

from datetime import date, time, datetime

print(date(year=2021, month=12, day=27))

print(time(hour=9, minute=19, second=59))

print(datetime(year=2021, month=12, day=27, hour=9, minute=19, second=59))

以上代码创建了3个对象,它们的类型分别是datetimedatetime,保持上述文件并执行指令python3 start.py你将看到以下输出结果:

% python3 start.py 
2021-12-27
09:19:59
2021-12-27 09:19:59

除此之外,你还可以通过字符串所表示的日期和时间来创建这些对象。比如,在文件start.py中编写以下内容:

from datetime import date

print(date.fromisoformat('2021-12-27'))

以上代码使用了方法fromisoformat来创建一个date对象,该方法期望的输入是一个符合ISO 8601规范的日期'2021-12-27'。如果你输入的时间和日期不符合该规范,你可以使用下面这种方法:

from datetime import datetime

date_in_string = '12-27-2021 9:19:59'
custom_format = '%m-%d-%Y %H:%M:%S'
print(datetime.strptime(date_in_string, custom_format))

以上代码用到了strptime,该方法允许你输入不符合ISO 8601规范的时间和日期,不过,你需要自己指定所输入的时间日期('12-27-2021 9:19:59')的格式('%m-%d-%Y %H:%M:%S')。运行指令python3 start.py,你会得到以下结果:

% python3 start.py 
2021-12-27 09:19:59

关于strptime所支持的格式以及格式中各个组成部分的解释,你可以参考这里

如果你留心观察以上时间+日期的输出,你会发现时间部分并没有包含时区的信息。当我们创建时间对象时,就已经假设该时间对象的时区默认为电脑所设置的时区。由于我的电脑时区设置的是北京时间(UTC+8),因此以上输出的时间默认都是在这个时区。

这样的时间存在一个问题:如果美国地区使用以上时间,那么由于这些时间没有提供时区的信息,那么以上时间就会错误的表示成美国时区的时间。为了解决这个问题,我们需要给时间加上时区的信息,因此需要借助第三方库pytz

考虑时区

全球有多少个时区呢?答案是37个时区。如果现在是北京时间5月2号8:00AM,那么对应的纽约时间就是5月1号8:00PM。当你使用电脑的时候,你会根据自己的时区来设置相对应的时区,比如我在中国,那么我的时区就设置为UTC+8,如果我在纽约,那么我可以设置UTC-4。读者可以通过这里来了解时区是如何划分的。

Python中有一种类型叫datetime,它是指日期+时间,既然涉及到了时间,那么就应该把时间与时区绑定在一起来思考,从而使得你所编写的程序能够在不同时区正确执行。

为了保留时区,我们需要通过以下2个方面来实现:

  1. 创建带有时区信息的datetime对象
  2. 当存储时间的时候,使用ISO 8601标准来格式化时间,原因在于ISO 8601标准保留了时区信息。

为了实现以上2部分,你首先需要安装pytz包,接着,在start.py中输入以下代码:

from datetime import datetime
import pytz

print(datetime.now(tz=pytz.utc))

print(datetime.now(tz=pytz.utc).isoformat())

执行以上代码,你会得到以下输出结果:

% python3 start.py
2021-12-26 02:39:46.628761+00:00
2021-12-26T02:39:46.628829+00:00

从以上输出结果可知,时间部分包含了时区信息00:00(UTC),最后一行是以ISO 8601标准来输出今天的日期+时间。以上输出的时间的时区是UTC+0,那么,如果你想创建一个包含时区UTC+8的datetime对象,你可以参考以下代码:

from datetime import datetime
import pytz

print(datetime.now(tz=pytz.timezone('Asia/Shanghai')))

执行以上代码,你将得到北京时区的时间,如下所示:

% python3 start.py
2021-12-26 11:00:57.410203+08:00

以上2个例子均创建了带有时区的datetime对象,当你想创建time对象时,也可以遵守以上规则来为该时间对象添加时区。关于pytz的使用,你可以参考这里。如果你想了解时区的概念,那么可以参考以下内容:

总结

本文介绍了datetime模块,其中涉及了datetimedatetimetzinfo类型。通常,你只需要使用它们就能非常方便地在Python中表达时间+日期。如果你编写的程序需要跨越不同的时期,那么从一开始你就需要为这些时间加上时区。为了添加时区,你需要借助第三方包pytz,因此你首先需要安装它。

到目前为止,我们介绍了Python的基础知识,涉及的内容主要有:

我们可以借助以上知识来编写简单的Python程序,然而想要编写复杂的程序,则要借助其它高级的知识。接下来,让我们进入高阶知识的学习:Python的函数

发布于 2021-12-26 11:31