Python的时间、日期和日历操作
Python 提供了内置的 time 、 datetime和 calendar模块可以用于时间、日期和日历操作。
内置的time模块提供了各种与时间相关的函数。time --- 时间的访问和转换 — Python 3.10.6 文档
内置的datetime 模块提供用于处理日期和时间的类。datetime --- 基本日期和时间类型 — Python 3.10.6 文档
内置的calendar 模块提供了日历相关函数。datetime --- 基本日期和时间类型 — Python 3.10.6 文档
上面给出的官方文档链接内容不太好理解,可以先略过,先看下文,回头当资料查看。
处理日期和时间主要有以下场景
获取当前的日期和时间
格式化日期和时间
计算两个时间的差值
time模块用法
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模块用法
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 秒小数点后面的差值
运行之:
calendar模块的用法
该模块用于处理日历信息,内置了月份和星期的列表,可以当做一个常量来使用。
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!