时间的记录因为时区,传统,意义不同会有很多种不同的方式或者不同的结果来呈现对应的时间,比如我们的北京时间和华盛顿时间就相差十几个小时,再比如农历和阳历也存在记录差别,这时候我们就需要在编程语言中统一时间才能表达精准的时间,除此之外对于不同的时间也可以通过time模块进行简单的处理得到我们想要的结果。
一、了解时间
从时间的标准统一上来讲,我们主要分两种(这两种时间我们主要研究第一种):
- UTC(世界协调时间):格林尼治时间,中国是UTC+8
- DST(夏令时):百科https://baike.baidu.com/item/%E5%A4%8F%E4%BB%A4%E6%97%B6/1809579?fr=aladdin
从时间的表现形式上来区分的话分为3中情况:
- 时间戳:从1970年1月1日到当前时间间隔,以整数或者浮点数表示,以秒为单位
- 元祖:用9个整型数据表示time.struct_time(tm_year=2021, tm_mon=9, tm_mday=16, tm_hour=11, tm_min=40, tm_sec=5, tm_wday=3, tm_yday=259, tm_isdst=0)(flag有三种情况1,-1,0:1表示夏令时,-1是根据当前情况自动判断,0表示正常格式)
- 格式化字符串:看下一个注释中的内容
二、python中时间日期格式化符号
了解格式化输出时间的一些常用符号对于我们后面学习time时间模块有很大的帮助。
%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 当前时区的名称
%% %号本身
三、时间戳和时间元祖操作
1.接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
time.asctime([tupletime])
2.返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
res = time.time() # 获取时间戳
print(res)
返回结果:
1637243656.6083195
3.将时间戳转为UTC时间元祖,注意这里不是北京时间(东八区时间)
t = time.gmtime(res)
print(t)
返回结果:
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=18, tm_hour=13, tm_min=54, tm_sec=16, tm_wday=3, tm_yday=322, tm_isdst=0)
4.将时间戳转为本地时间元祖
bt = time.localtime(res)
print(bt)
返回结果:
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=18, tm_hour=21, tm_min=54, tm_sec=16, tm_wday=3, tm_yday=322, tm_isdst=0)
5.将本地时间元祖转成时间戳
print(time.mktime(bt))
返回结果:
1637243656.0
6.接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。
print(time.localtime()) # 获取时间元祖
print(time.localtime(1120978225.2760954)) # 通过时间戳获取为时间元祖
返回结果:
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=18, tm_hour=21, tm_min=54, tm_sec=16, tm_wday=3, tm_yday=322, tm_isdst=0)
time.struct_time(tm_year=2005, tm_mon=7, tm_mday=10, tm_hour=14, tm_min=50, tm_sec=25, tm_wday=6, tm_yday=191, tm_isdst=0)
四、格式化时间
1.格式化时间(可以对时间戳和时间元祖进行格式化)
print(time.ctime(time.time())) # 把时间戳转成字符串
print(time.asctime(time.localtime(1120978225.2760954))) # 把时间元祖转成字符串
返回结果:
Thu Nov 18 21:58:47 2021
Sun Jul 10 14:50:25 2005
2.接收以时间元组,并返回以可读字符串表示的当地时间,可以接受元祖转特定时间。
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) # 元祖转格式化
返回结果:
2021-11-18 21:58:47
3.根据fmt的格式把一个时间字符串解析为时间元组。
print(time.strptime('2021-05-14 15:57:09', '%Y-%m-%d %H:%M:%S')) # 时间字符串转元祖
返回结果:
time.struct_time(tm_year=2021, tm_mon=5, tm_mday=14, tm_hour=15, tm_min=57, tm_sec=9, tm_wday=4, tm_yday=134, tm_isdst=-1)
五、CPU时间
一般用于计算代码或硬件处理性能,Python 3.8 已移除 clock() 方法 可以使用 perf_counter() 或 process_time() 方法替代。
start = time.perf_counter()
for i in range(0, 10000):
print(i)
# end = clock()
end = time.perf_counter()
print(end - start)
# 推迟调用线程的运行,secs指秒数。
time.sleep(2)