Python 中包含了 datetime 模块,它提供了非常强大的功能来处理日期和时间。要想在脚本中使用 datetime 模块提供的功能,需要在脚本上方加入 from datetime import date,time, datetime, timedelta ,放在之前的 import 语句下面。现在 first_script.py 的上方应该是这样的:

#!/usr/bin/env python3

from math import exp, log, sqrt

import re

from datetime import date, time, datetime, timedelta

导入 datetime 模块之后,就有各式各样的日期时间对象和函数供你随意使用了。常用的对象和函数包括 today 、 year 、 month 、 day 、 timedelta 、 strftime 和 strptime 。这些函数可以捕获具体的日期数据(例如:年、月、日)、进行日期和时间的加减运算、创建特定形式的日期字符串以及根据日期字符串创建 datetime 对象。下面是使用这些 datetime 对象和函数的几个示例。第一组示例演示了 date 对象和 datetime 对象之间的区别:

# 打印出今天的日期形式,以及年、月、日

today = date.today()

print("Output #41: today: {0!s}".format(today))

print("Output #42: {0!s}".format(today.year))

print("Output #43: {0!s}".format(today.month))

print("Output #44: {0!s}".format(today.day))

current_datetime = datetime.today()

print("Output #45: {0!s}".format(current_datetime))

通过使用 date.today() ,你可以创建一个 date 对象,其中包含了年、月、日,但不包含时间元素,比如时、分、秒。相反,通过 datetime.today() 创建的对象则包含时间元素。{0!s} 中的 !s 表示传入到 print 语句中的值应该格式化为字符串,尽管它是个数值型数据。最后,你可以使用 year 、 month 和 day 来捕获具体的日期元素。下一个示例演示了如何使用 timedelta 函数来对 date 对象进行时间的加减操作:

# 使用timedelta计算一个新日期

one_day = timedelta(days=-1)

yesterday = today + one_day

print("Output #46: yesterday: {0!s}".format(yesterday))

eight_hours = timedelta(hours=-8)

print("Output #47: {0!s} {1!s}".format(eight_hours.days, eight_hours.seconds))

在这个示例中,使用 timedelta 函数从今天减去了 1 天。当然,还可以在括号中使用days=10 、 hours=-8 或者 weeks=2 来创建变量,分别表示未来 10 天、以前 8 个小时或者未来 2 个星期。

在使用 timedelta 时需要注意的一点是,它将括号中的时间差以天、秒和毫秒的形式存储,然后将数值规范化后得到一个唯一的值。这说明分钟、小时和星期会被分别转换成 60秒、3600 秒和 7 天,然后规范化,就是生成天、秒和毫秒“列”(类似于小学数学中的个位、十位 等等)。举例来说, hours=-8 的输出是 (-1 days, 57,600 seconds) ,不是更简单的 (-28,800 seconds) 。是这样计算的:86 400 秒(3600 秒每小时 *24 小时每天)-28 800秒(3600 秒每小时 *8 小时)= 57 600 秒。正如你所见,对负值的规范化乍看上去很令人吃惊,特别是在进行取整和舍入时。第三个示例展示了如何从一个 date 对象中减去另一个。相减的结果是个 datetime 对象,将所得的差以天、小时、分钟和秒来显示。例如,在这个示例中结果是“1 day, 0:00:00”:

# 计算出两个日期之间的天数

date_diff = today - yesterday

print("Output #48: {0!s}".format(date_diff))

print("Output #49: {0!s}".format(str(date_diff).split()[0]))

在某些情况下,你可能只需要结果中的数值部分。举例来说,在这个示例中你只需要数值1。从结果中得到这个数值的一种方法是使用前面已经讨论过的字符串函数。 str 函数可以将结果转换成字符串; split 函数可以使用空白字符将字符串拆分,并使每个子字符串成为列表的一个元素; [0] 表示“取出列表中的第一个元素”,在本例中就是数值 1。