Python 提供了内置的 time 、 datetime和 calendar模块可以用于时间、日期和日历操作。
内置的time模块提供了各种与时间相关的函数。time --- 时间的访问和转换 — Python 3.10.6 文档
内置的datetime 模块提供用于处理日期和时间的类。datetime --- 基本日期和时间类型 — Python 3.10.6 文档
内置的calendar 模块提供了日历相关函数。datetime --- 基本日期和时间类型 — Python 3.10.6 文档
上面给出的官方文档链接内容不太好理解,可以先略过,先看下文,回头当资料查看。
处理日期和时间主要有以下场景
获取当前的日期和时间
格式化日期和时间
计算两个时间的差值
import time # 引入time模块
time.time() #会返回 从 1970年1月1日0点(所谓的epoch时间点) 到 当前时间的 经过的秒数 ,可以简称为秒数时间,也称为时间戳。
time.localtime() # 以struc_time元组的形式返回当前时间
struc_time元组包含了9个元素,每个元素的含义如下
tm_year, 表示年份,四位数
tm_mon, 表示月份,1到12之间的一个数字
tm_mday,表示每月的第几天,1到31之间的一个数字
tm_hour, 表示小时,0到23之间的一个数字
tm_min, 表示分钟数,0到59之间的一个数字
tm_sec, 表示秒数,0到61之间第一个数字
tm_wday,表示星期,0到6之间的一个数字,0表示星期一,依次类推
tm_yaday,表示一年中的第几日,1到366之家的一个数字
tm_isdst, 是否为夏令时,1表示是,0表示否,-1表示未知
我们可以使用 time 模块的 strftime 方法来格式化日期,strftime()方法语法:
time.strftime(format[, t])
参数
format -- 格式符号串。
t -- 可选的参数t是一个struct_time对象。
返回以可读字符串表示的当地时间。
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
下面给出一个示例
- import time
- t = time.localtime() #以struc_time元组的形式返回当前时间
- print(t) #
- print("----")
- print(time.strftime("%b %d %Y %H:%M:%S", t)) #格式化日期
运行之:

下面计算两个时间相差多少秒的源码:
- import time
- a ="2022-07-22 23:00:00"
- b ="2021-07-21 22:10:00"
- t1 = time.strptime(a, "%Y-%m-%d %H:%M:%S")
- t2 = time.strptime(b, "%Y-%m-%d %H:%M:%S")
- t3 = (time.mktime(t1)-time.mktime(t2))
- print(str(t3))
运行之:

开发程序时,经常需要获取两个代码位置在执行时的时间差,比如,我们想知道某个函数执行大概耗费了多少时间,就可以使用time.time()来做。
import time
before = time.time()
#这里放测试程序段或调用的函数
after = time.time()
print(f"花费时间{after-before}")
下面给出一个实际例子——查看递归法求阶乘耗费时间——源码如下:
- import time
- #递归法求阶乘
- def factorial(n):
- result = n
- for i in range(1,n):
- result *= i
- return result
-
- n=int(input("请输入一个整数:"))
- before = time.time()
- #这里放测试程序段或调用的函数
- print(str(n) + "!=" + str(factorial(n)))
- after = time.time()
- print(f"花费时间{after-before}")
运行之:

datetime是日期和时间处理的基本模块,当然也支持获取当前日期和格式化,其更独特的功能是进行时间的运算,如计算两个日期之间差了几天。
import datetime # 引入datetime模块
datetime.date.today() # 获取当前日期
datetime.date.today().year # 获取年份
下面计算两个日期的间隔源码如下:
- import datetime
-
- # 计算两个日期的间隔
- time_format = '%Y-%m-%d %H:%M:%S'
- d1 = datetime.datetime.strptime('2022-07-22 23:00:00', time_format)
- d2 = datetime.datetime.strptime('2021-07-21 22:10:00', time_format)
- DD = d1 - d2
- print(DD) #两个日期的间隔
- print(DD.days) #两个日期的间隔天数
- print(DD.seconds) #仅时间差中的间隔秒数【注】
- print(DD.total_seconds()) #两个日期相隔的秒数
【注】seconds属性获得的秒只是时间差中的小时、分钟和秒部分的和,并没有包含时间差的天数(既是两个时间点不是同一天,失效)。请注意seconds 属性和total_seconds()函数的区别。
属性 值
days 获取相差天数,不包括前面的天数和秒后面的小数
seconds 获取时间差中的秒数,,不包括前面的天数和秒后面的小数
microseconds 秒小数点后面的差值
运行之:

该模块用于处理日历信息,内置了月份和星期的列表,可以当做一个常量来使用。
import calendar #引入日历模块
print(calendar.calendar(2022)) #显示指定年份的日历
print(calendar.month(2022,8)) # 显示指定年月的日历
下面给出完整的生成指定日期的日历源码:
- import calendar #引入日历模块
-
- yy = int(input("输入年份: ")) # 输入指定年
- mm = int(input("输入月份: ")) # 输入指定月
-
- print(calendar.month(yy,mm)) # 显示日历
运行之:

上面我们返回的日历大是英文的。对中文语境不友好。下面给出改进,实现把calendar的日历转换成中文的。
法一,源码如下:
- import calendar
- c = calendar.LocaleTextCalendar(locale="zh_CN")
- c.prmonth(2021, 4)
运行之:

不太整齐。
法二、源码如下:
- import calendar
-
- def showmonth(year, month):
- res = calendar.monthrange(year, month)
- days = res[1] # 当前月份的天数
- w = res[0] # 当前月份第一天是星期几
- print(f" {year}年{month}月的日历信息")
- print(" 一 二 三 四 五 六 日 ")
- print("---------------------------")
- d = 1
- print(" " * w, end="")
- while d <= days:
- print(' {:0>2d} '.format(d), end="")
- if (d + w) % 7 == 0:
- print("\n", end="")
- d += 1
- print("\n---------------------------")
-
- showmonth(2022,8) # 调用
运行之:

OK!