Python time和datetime用法小结
Python内置两个关于时间处理的包,
time
和datetime
。本文用于记录笔者在使用这两个包时的一些心得,将会不间断更新。
从命名上讲,
time
包提供处理时间相关的函数,
datetime
包提供处理时间日期相关的函数。
time包
time.sleep()
time.sleep()
是
time
包中使用最频繁的函数之一,它接收一个参数,用于以单位秒指定睡眠时间,任何调用该方法的线程都会阻塞至计时完成。
time.sleep(1) # 当前线程将睡眠1s
time.time()
计时绕不开一个固定时间,1970年,为什么?因为1970年是距今最早的的1月1日是星期一的日期,计算当前时间是星期几时最为方便,是一个合适的初始时间锚定值。
time.time()
则是
time
包中使用最频繁的又一个函数,它返回一个秒级别的时间戳(本质上是从1970至今经过的秒数,float类型,小数点后范围不定)。
时间戳不会重复,也包含了时间信息,因此常用作任务的task_id(也可以使用uuid)。
在对时间不那么精确的条件下,经常去掉小数部分:
import time
print(round(time.time())) # 1641712467
也可以将时间戳转换为日期格式:
import time
print(time.localtime(time.time()))
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))
time.mktime
将struct_time格式转回成时间戳(存在精度损失):
import time
now = time.localtime(time.time())
print(now)
print(time.mktime(now))
时间格式指定
time.strftime("%Y-%m-%d %H:%M:%S")
里面的格式控制字符有哪些呢?参见下表:
格式 |
说明 |
---|---|
%a |
显示简化星期名称 |
%A |
显示完整星期名称 |
%b |
显示简化月份名称 |
%B |
显示完整月份名称 |
%c |
本地相应的日期和时间表示 |
%d |
显示当月第几天 |
%H |
按24小时制显示小时 |
%I |
按12小时制显示小时 |
%j |
显示当年第几天 |
%m |
显示月份 |
%M |
显示分钟数) |
%p |
本地am或者pm的相应符 |
%S |
显示秒数) |
%U |
一年中的星期数 |
%w |
显示在星期中的第几天,默认从0开始表示周一 |
%W |
和%U基本相同 |
%x |
本地相应日期 |
%X |
本地相应时间 |
%y |
去掉世纪的年份(00 - 99) |
%Y |
完整的年份 |
%Z |
时区的名字(如果不存在为空字符) |
%% |
‘%’字符 |
同样适用于下面的
datetime.datetime.now.strftime()
datetime包
datetime.datetime.now()
datetime.datetime.now()
是datetime包中使用最为频繁的一个函数,它用于获取当前的日期和时间:
import datetime
now = datetime.datetime.now()
print(now)
print(type(now)) # 注意是datetime对象类型
底层也是依赖
time.time()
实现的。
可以转换成整洁的字符格式日期:
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(now)
使用示例:计算当前时间及24小时之前的时间
假设我们要统计一天之内的数据(比如测算服务器一天之内的qps),那就需要从当前时间倒推24h。
使用time包实现:
import time
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - 86400))
end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
print(start_time)
print(end_time)
使用datetime包实现:
import datetime
end_time = datetime.datetime.now()
start_time = end_time - datetime.timedelta(days=1)