第22章-使用日期和时间

python为开发人员提供了几个工具来处理日期和时间。在本章中,我们将介绍 日期时间time 模块。我们将研究它们是如何工作的,以及它们的一些共同用途。让我们从 日期时间 模块!

日期时间模块

我们将从 日期时间 模块:

  • datetime.date

  • datetime.timedelta

  • datetime.datetime

这些将覆盖大多数需要在Python中使用日期和日期时间对象的实例。还有一个 茨芬格 我们将不涉及的时区。有关该类的更多信息,请随意查看python文档。

datetime.date

python可以用几种不同的方式表示日期。我们要看看 datetime.date 首先格式化,因为它恰好是一个简单的日期对象。

>>> datetime.date(2012, 13, 14)
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.ValueError: month must be in 1..12
>>> datetime.date(2012, 12, 14)
datetime.date(2012, 12, 14)

此代码演示如何创建简单的日期对象。日期类接受三个参数:年、月和日。如果传递的值无效,您将看到 ValueError 就像上面的那个。否则,您将看到 datetime.date 返回了对象。让我们来看另一个例子:

>>> import datetime
>>> d = datetime.date(2012, 12, 14)
>>> d.year
2012
>>> d.day
14
>>> d.month
12

这里我们将日期对象赋给变量 d .现在我们可以按名称访问各种日期组件,例如 d.yeard.month .现在我们来看看今天是几号:

>>> datetime.date.today()
datetime.date(2014, 3, 5)

这在你需要记录的时候很有用。或者您可能需要根据今天进行基于日期的计算。不过,这是一个方便的小方法。

datetime.datetime

A datetime.datetime 对象包含来自date time.date和datetime.time对象的所有信息。让我们创建几个示例,以便更好地理解此对象和datetime.date对象之间的区别。

>>> datetime.datetime(2014, 3, 5)
datetime.datetime(2014, 3, 5, 0, 0)
>>> datetime.datetime(2014, 3, 5, 12, 30, 10)
datetime.datetime(2014, 3, 5, 12, 30, 10)
>>> d = datetime.datetime(2014, 3, 5, 12, 30, 10)
>>> d.year
2014
>>> d.second
10
>>> d.hour
12

在这里我们可以看到 datetime.datetime 接受几个附加参数:年、月、日、小时、分钟和秒。它还允许您指定微秒和时区信息。当您使用数据库时,您会发现自己经常使用这些类型的对象。大多数情况下,您需要将python日期或date time格式转换为sql datetime或timestamp格式。您可以使用两种不同的方法了解datetime.datetime的今天是什么:

>>> datetime.datetime.today()
datetime.datetime(2014, 3, 5, 17, 56, 10, 737000)
>>> datetime.datetime.now()
datetime.datetime(2014, 3, 5, 17, 56, 15, 418000)

datetime模块有另一个您应该知道的方法 斯特夫提姆 .此方法允许开发人员创建一个字符串,该字符串以更易于阅读的格式表示时间。在第8.1.7节的python文档中,有一个完整的格式化选项表。我们将通过几个例子向您展示这个方法的强大功能:

>>> datetime.datetime.today().strftime("%Y%m%d")
'20140305'
>>> today = datetime.datetime.today()
>>> today.strftime("%m/%d/%Y")
'03/05/2014'
>>> today.strftime("%Y-%m-%d-%H.%M.%S")
'2014-03-05-17.59.53'

第一个例子是黑客。它演示了如何将今天的日期时间对象转换为遵循YYMMDD(年、月、日)格式的字符串。第二个例子更好。在这里,我们将今天的日期时间对象赋给一个名为 今天 然后尝试两种不同的字符串格式化操作。第一个元素在datetime元素之间加上正斜杠,并对其进行重新排列,使其成为月、日、年。最后一个示例创建了一个时间戳,其排序格式相当典型:YYYY-MM-DD.HH.MM.SS。如果你想进入一个两位数的年份,你可以换掉 %Y 对于 %y .

datetime.timedelta

这个 datetime.timedelta 对象表示持续时间。换句话说,这是两个日期或时间之间的差异。让我们来看一个简单的例子:

>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2014, 3, 5, 18, 13, 51, 230000)
>>> then = datetime.datetime(2014, 2, 26)
>>> delta = now - then
>>> type(delta)
<type 'datetime.timedelta'>
>>> delta.days
7
>>> delta.seconds
65631

我们在这里创建两个日期时间对象。一个今天一个星期前。然后我们来分析它们之间的区别。这将返回一个TimeDelta对象,然后我们可以使用该对象找出两个日期之间的天数或秒数。如果你需要知道这两者之间的小时或分钟数,你必须用一些数学计算出来。有一种方法可以做到:

>>> seconds = delta.total_seconds()
>>> hours = seconds // 3600
>>> hours
186.0
>>> minutes = (seconds % 3600) // 60
>>> minutes
13.0

这告诉我们一周有186小时13分钟。注意,我们使用的是双正斜杠作为除法运算符。这被称为 向下取整数 .

现在我们准备好继续学习 time 模块!

时间模块

这个 time 模块提供了Python开发人员对各种与时间相关的函数的访问。时间模块基于它所称的 时代 时间的起点。对于Unix系统,时代是在1970年。要了解系统中的epoch是什么,请尝试运行以下命令:

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

我在Windows7上运行这个程序,似乎也认为时间始于1970年。无论如何,在本节中,我们将研究以下与时间相关的函数:

  • time.ctime

  • time.sleep

  • time.strftime

  • time.time

我们开始吧!

time.ctime

这个 time.ctime 函数将以秒为单位的时间转换为表示本地时间的字符串。如果没有传递任何内容,则返回当前时间。让我们尝试几个例子:

>>> import time
>>> time.ctime()
'Thu Mar 06 07:28:48 2014'
>>> time.ctime(1384112639)
'Sun Nov 10 13:43:59 2013'

这里我们显示通话结果 CTIME公司 一点都没有,而且从新纪元开始有相当随机的秒数。我见过有人将日期保存为从新纪元开始的秒数,然后他们想把它转换成人类能理解的东西。将一个大整数(或长整数)保存到数据库中,然后将其从datetime对象格式化为数据库接受的任何日期对象,这样做要简单一些。当然,这也有一个缺点,即您需要将整数值或浮点值转换回字符串。

time.sleep

这个 time.sleep 函数使开发人员能够在给定的秒数内暂停脚本的执行。这就像在程序中添加一个暂停。当我需要等待文件完成关闭或数据库提交完成提交时,我发现这一点非常有用。让我们来看一个例子。在 IDLE 状态下打开一个新窗口并保存以下代码:

import time

for x in range(5):
    time.sleep(2)
    print("Slept for 2 seconds")

现在在 IDLE 状态下运行代码。你可以去 Run 菜单,然后选择 运行模块 菜单项。当你这样做的时候,你会看到它把短语打印出来。 睡了2秒钟 五次,每次打印间隔两秒。它真的很容易使用!

time.strftime

这个 time 模块具有 斯特夫提姆 函数的工作方式与日期时间版本几乎相同。区别主要在于它接受输入的内容:元组或 struct_time 对象,就像调用时返回的对象一样 时间.gmtime())time.localtime()。 .下面是一个小例子:

>>> time.strftime("%Y-%m-%d-%H.%M.%S",
                  time.localtime())
'2014-03-06-20.35.56'

此代码与我们在本章的datetime部分中创建的时间戳代码非常相似。我认为datetime方法更直观一些,因为您只需创建一个 datetime.datetime 对象,然后调用其 斯特夫提姆 方法的格式。对于时间模块,您必须传递格式和时间元组。由你决定哪一个对你来说最有意义。

time.time

这个 time.time 函数将以秒为单位以浮点数返回自epoch以来的时间。让我们看看:

>>> time.time()
1394199262.318

这很简单。当您希望将当前时间保存到数据库,但不想将其转换为数据库的datetime方法时,可以使用此方法。你可能还记得 CTIME公司 方法接受以秒为单位的时间,因此我们可以使用 time.time 要获得传递给CTIME的秒数,请执行以下操作:

>>> time.ctime(time.time())
'Fri Mar 07 07:36:38 2014'

如果您在时间模块的文档中做了一些深入的研究,或者只是做了一点实验,您可能会发现这个函数还有其他一些用途。

总结

此时,您应该知道如何使用Python的标准模块处理日期和时间。在处理日期方面,python给了你很大的能力。如果您需要创建一个跟踪约会或需要在特定日期运行的应用程序,您会发现这些模块很有用。它们在处理数据库时也很有用。