Python——第五章:time模块、datetime模块
time模块
在平常的代码中,我们常常需要与时间打交道。在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍。
我们写程序时对时间的处理可以归为以下3种:时间的显示,在屏幕显示、记录日志等"2022-03-04"
时间的转换,比如把字符串格式的日期转成Python中的日期类型时间的运算,计算两个日期间的差值等
在Python中,通常有这几种方式来表示时间:
- 时间戳(timestamp), 表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。例子:1554864776.161901
- 格式化的时间字符串,比如“2020-10-03 17:54”
- 元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同,
- mac上:time.struct_time(tm_year=2020, tm_mon=4, tm_mday=10, tm_hour=2,tm_min=53, tm_sec=15, tm_wday=2, tm_yday=100, tm_isdst=0)
索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1
UTC时间
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8,又称东8区。DST(Daylight Saving Time)即夏令时。
time模块的常用方法
time.sleep(secs) :线程推迟指定的时间运行,单位为秒。
import time
# time.sleep(secs) 可以暂停一段时间(秒)
print("你好啊")
time.sleep(3) #程序等待3秒
print("你也好啊")
可以控制程序执行的频率
while True:
print("爬虫程序正在抓取百度信息")
time.sleep(3)
甚至可以用随机数进行替换
import time
import random
# 生成一个1-5秒的随机延迟
delay = random.uniform(1, 5)
# 暂停相应的随机时间
time.sleep(delay)
time.time() :获取当前时间的时间戳。(数字类型的时间)
time.time()
它返回当前时间的时间戳。时间戳是自1970年1月1日00:00:00(UTC)以来的秒数,不包括闰秒。
这个函数通常用于获取代码运行时的时间,可以用于性能测试、时间戳日志等。返回的时间戳是一个浮点数,表示秒数,同时也可以表示毫秒、微秒等。
下面是一个简单的例子:
import time
print(time.time())
#运行结果 2023-12-05 17:36:44.449821
1701769004.449821
1701769004.449821 这个数字是一个十进制数,表示的是从1970年1月1日00:00:00 UTC到现在的秒数,以及微秒数。其中,小数点后面的部分(449821)表示的是微秒数
使用time计算时间差运算(单位秒)
import time
start = time.time()
for i in range(1000):
a=i
end = time.time()
print(end-start) #计算循环运算耗费了多少时间
994
995
996
997
998
999
0.006974002838134766
Datetime模块
相比于time模块,datetime模块的接口则更直观、更容易调用
datetime模块定义了下面这几个类:
- datetime.date:表示日期的类。常用的属性有year, month, day;
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
- datetime.datetime:表示日期时间。
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
- datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
我们需要记住的方法仅以下几个:
1.获取当前的datetime时间和日期
datetime.datetime.now()
可以配合调用.timestamp()
、.today()
、.year
、.timetuple()
、.time()
等方法
import datetime
print(datetime.datetime.now()) # 打印当前日期
print(datetime.datetime(2013, 12, 5, 17, 58, 43)) # 打印指定日期2013-11-05 17:58:43
print(datetime.datetime.now().timestamp()) # 打印时间戳
print(datetime.datetime.now().today()) # 打印现在时间
print(datetime.datetime.now().year) # 打印现在年
print(datetime.datetime.now().timetuple()) # 转化为time.struct_time()的9个元素的时间元组
print(datetime.datetime.now().time()) # 只显示现在时间,没有日期
#运行结果
2023-12-05 17:58:54.203664
2013-11-05 17:58:43
1701770334.203664
2023-12-05 17:58:54.203664
2023
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=58, tm_sec=54, tm_wday=1, tm_yday=339, tm_isdst=-1)
17:58:54.203664
datetime.date
print(datetime.date.today()) # 只显示今天日期,没有时间
print(datetime.date(1990-12-12)) # 指定一个时间
#运行结果
2023-12-05
1990-12-12
2.把一个时间戳转为datetime日期类型datetime.date.fromtimestamp(1701770334.203664)
import datetime
print(datetime.datetime.fromtimestamp(1701770334.203664))
print(datetime.date.fromtimestamp(1701770334.203664))
#运行结果
2023-12-05 17:58:54.203664
2023-12-05
3. 时间运算datetime.timedelta()
print(datetime.datetime.now())
print(datetime.datetime.now() + datetime.timedelta(-4)) # 默认参数是天,当前时间 -4天
print(datetime.datetime.now() + datetime.timedelta(days=5, hours=3, minutes=30)) # 详细设置参数,当前时间+5天,3小时,30分钟
#运行结果
2023-12-09 17:37:11.701322
2023-12-05 17:37:11.701322 #当前时间 -4天
2023-12-14 21:07:11.701322 #当前时间 +5天,3小时,30分
单位换算.total_seconds()
、
import datetime
t1 = datetime.datetime(2018, 1, 2, 12, 30, 0)
t2 = datetime.datetime.today()
diff = t2 - t1
print(diff)
print(diff.total_seconds()) #换算成秒
#运行结果
2167 days, 4:34:55.250549
187245295.250549
4. 时间替换.replace()
print(datetime.datetime.now().replace(year=2999,month=11,day=30))
2999-11-30 15:12:17.046692
5.格式化一个时间.strftime()
strftime => str + f(format) + time 字符串+格式化+时间
使用标准的系统时间,默认的格式是:2023-12-09 17:59:45.835316
t = datetime.datetime.now()
print(t)
#运行结果
2023-12-09 17:59:45.835316
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 当前时区的名称
%% %号本身
利用表中的对应关系,我们把标准的时间(2023-12-09 17:59:45.835316)改造成我们需要的时间格式(2023年12月09日 17小时59分钟45秒)
t = datetime.datetime.now()
print(t)
print(t.strftime("%Y年%m月%d日 %H小时%M分钟%S秒"))
#运行结果
2023-12-09 17:59:45.835316
2023年12月09日 17小时59分钟45秒
6.计算时间差
手动输入时间,把字符串以特定格式转换成时间.strptime
=> str + p(parse) + time 字符串+转化+时间
import datetime
s1 = input("请输入第一个时间(yyyy-mm-dd HH:MM:SS):")
s2 = input("请输入第二个时间(yyyy-mm-dd HH:MM:SS):")
# 把字符串转化成时间
t1 = datetime.datetime.strptime(s1, "%Y-%m-%d %H:%M:%S")
t2 = datetime.datetime.strptime(s2, "%Y-%m-%d %H:%M:%S")
print(t2 - t1)
#运行结果
请输入第一个时间(yyyy-mm-dd HH:MM:SS):2022-12-1 1:1:1
请输入第二个时间(yyyy-mm-dd HH:MM:SS):2023-12-1 2:2:1
365 days, 1:01:00
这里需要感受一下,形参和实参的对应关系。
总结:
time必要掌握的内容
time.sleep(secs) #让程序休眠多少秒
time.time() #获取当时的时间戳
datetime必要掌握的内容
datetime.datetime.now() #系统时间
datetime.datetime(2013, 12, 5, 17, 58, 30) #自定义指定一个时间
.strftime("%Y年%m月%d日 %H小时%M分钟%S秒")) #格式化一个时间
.strptime(str, "%Y-%m-%d %H:%M:%S") #把字符串转化为时间
date.today() #获取今天的时间
time模块扩展阅读:
由于time模块复杂以及难以调用,time后面大多的功能都被datetime模块替代,仅提供大家了解
time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。如果 secs
参数省略,则默认使用当前时间。它返回的是一个时间元组(time.struct_time),包含年、月、日、小时、分钟、秒等信息。
import time
print(time.localtime())
#运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=33, tm_sec=6, tm_wday=1, tm_yday=339, tm_isdst=0)
time.gmtime([secs]):和time.localtime()方法类似,time.gmtime([secs])函数将给定的时间戳转换为UTC时间(即协调世界时)。如果 secs
参数省略,则默认使用当前时间。它返回的是一个时间元组(time.struct_time),包含年、月、日、小时、分钟、秒等信息。
import time
print(time.gmtime())
#运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=9, tm_min=35, tm_sec=55, tm_wday=1, tm_yday=339, tm_isdst=0)
time.mktime(t) :将一个struct_time转化为时间戳。time.mktime()
函数接受一个时间元组作为参数,但时间元组的各个字段应该是按照顺序排列的,而不能使用关键字参数。
import time
print(time.mktime(time.localtime())) #把当前时间,以时间戳的方式输出
print(time.mktime((2023, 12, 5, 11, 1, 8, 5, 343, 0))) #把指定时间,以时间戳的方式输出
#运行结果
1701768786.0
1701745268.0
在这个例子中,我按照 (tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=11, tm_min=1, tm_sec=55, tm_wday=1, tm_yday=339, tm_isdst=0)
的顺序提供了时间元组的各个字段。请注意,tm_wday
(星期几)和 tm_yday
(一年中的第几天)这两个字段是自动计算的,所以你无需手动提供它们的值。
time.strftime(format[, t]) :把一个代表时间的元组或者struct_time“如由time.localtime()和time.gmtime()返回”转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。
import time
print(time.strftime("%Y-%m-%d %X", time.localtime()))
#运行结果
2023-12-05 17:45:31
time.strptime(string[, format]) :把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
import time
time.strptime("2023-12-5 17:54","%Y-%m-%d %H:%M")
#运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=1, tm_yday=339, tm_isdst=-1)
time时间戳和时间关系转换图
字符串转时间格式对应表非常复杂,十分不好记录,因此time模块基本上被datetime取代了