Python 的日期和时间对象类在单独的 datetime 模块中定义。datetime 模块包含处理日期、时间以及日期或时间之差(delta)的类。
术语箱
delta 的含义是“差”。这是一个希腊字母,看起来像是一个三角形(Δ)。
科学和数学领域经常使用希腊字母作为某些量的简写。delta 用于表示两个值之差。
我们要使用的第一种对象是 datetime 对象。(没错,这个类与模块同名。) datetime 对象包含年、月、日、小时、分和秒。可以像这样创建一个 datetime 对象(在交互模式中):
下面来看会得到什么:
>>> print when2008-10-24 10:45:56>>>
我们创建了一个 datetime 对象,名为 when,其中包含日期和时间值。
创建一个 datetime 对象时,参数的顺序(括号中的数)应当是年、月、日、小时、分和秒。不过如果你记不住这个顺序,也可以按任意顺序放置参数,只是要告诉 Python 各个参数分别表示什么,如下:
when = datetime.datetime(hour=10, year=2008, minute=45, month=10, second=56, day=24)
还可以对 datetime 对象做一些其他处理,你可以得到单个部分,比如年、日或者分。还可以得到日期和时间的一个格式化字符串。在交互模式中试试下面的代码:
datetime 对象分日期类和时间类。如果只关心日期,可以使用 date 类,其中只有年、月和日。如果只关心时间,可以使用 time 类,其中只包括小时、分和秒。如下所示:
>>> today = datetime.date(2008, 10, 24)>>> some_time = datetime.time(10, 45, 56)>>> print today2008-10-24>>> print some_time10:45:56
类似于 datetime 对象,如果指定了各个参数分别表示什么,完全可以按不同的顺序传入参数:
>>> today = datetime.date(month=10, day=24, year=2008)>>> some_time = datetime.time(second=56, hour=10, minute=45)
还有一种方法可以把 datetime 对象分解为 date 对象和 time 对象:
>>> today = when.date>>> some_time = when.time
另外可以使用 datetime 模块中 datetime 类的 combine 方法把 date 和 time 对象结合起来构成 datetime 对象:
我们已经知道了什么是 datetime 对象,也了解了它的一些属性,下面来看如何比较两个 datetime 对象,得到它们的差(两个时间之间间隔多长)。
两个时间之差
在仿真中,我们常常需要知道经过了多长时间。例如,在一个电子宠物程序中,可能需要知道上一次给宠物喂食之后过去了多长时间,来确定它是不是饿了。
datetime 模块为此提供了一个对象类,可以帮助我们得出两个日期或时间之差。这个类名为 timedelta。应该记得 delta 表示“差”。所以 timedelta 就是两个时间之差。
要创建一个 timedelta,得到两个时间之差,只需要将这两个时间相减,如下:
注意,将两个 datetime 对象相减时,我们得到的不是另一个 datetime,而是一个 timedelta 对象。Python 会自动完成这一点。
小段时间
到目前为止,我们一直都在讨论按整秒度量的时间。但是时间对象(date、time、datetime 和 timedelta)比这更精确。它们可以精确度量到微秒级,也就是百万分之一秒。
要了解这一点,可以试试 now 方法,它会给出计算机时钟的当前时间:
>>> print datetime.datetime.now2008-10-24 21:25:44.343000
注意这个时间不仅仅包含秒,还包括不到 1 秒的部分:
44.343000
我的计算机上,最后 3 位总是 0,因为我的操作系统的时钟只能精确到毫秒(千分之一秒)。不过对我来说这已经足够精确了!
有一点很重要,尽管秒部分看起来像是浮点数,但它实际上存储为秒数(整数)和微秒数(整数),也就是 44 秒和 343 000 微秒。要把它转换为浮点数还需要一个小公式。假设有一个名为 some_time 的时间对象,如果希望按浮点数形式得到秒数,相应的公式如下:
seconds_float = some_time.seconds + some_time.microseconds / float(1000000)
这里使用 float 函数来确保不会遭遇整数相除问题。
可以使用 now 方法和一个 timedelta 对象来测试你的打字速度。代码清单 24-2 中的程序会显示一条随机消息,用户必须键入这条消息。程序将检查用户键入这条消息所用的时间,然后计算出打字速度。你可以试试看。
代码清单 24-2 度量时间差——打字速度测试
关于 timedelta 对象还有一点应当知道。与 datetime 对象不同(datetime 对象包含年、月、日、小时、分和秒(以及微秒)),timedelta 对象只有日、秒和微秒。如果想得到月或年,必须根据天数计算出来。如果希望得到分或小时数,必须根据秒数来计算。