python中的time模块详解


更多Python标准库内容: 刷完这60个标准库模块:没人比我更懂Python了

无参数函数

先解释一下时间戳,所谓时间戳,即自1970年1月1日00:00:00所经历的秒数,然后就可以理解下面的函数了。下面代码默认from time import *

以秒为单位以纳秒为单位功能
time()time_ns()获取当前时间戳
thread_time()thread_time_ns()获取当前线程的CPU时间(不含休眠)
thread_time()thread_time_ns()获取当前进程的CPU时间(不含休眠)
monotonic()monotonic_ns()获取一个单调时钟的值
perf_counter()perf_counter_ns()获取一个计数器的值

上面五组函数中,只有time.time()的值具有绝对的意义,其他值都只具有相对的意义。

通过get_clock_info函数可以查看这些时钟的特性,其输入输出分别为

implementationmonotonicadjustableresolution
‘time’GetSystemTimeAsFileTime()✔️0.015625
‘thread_time’GetThreadTimes()✔️1e-07
‘process_time’GetProcessTimes()✔️1e-07
‘monotonic’GetTickCount64()✔️0.015625
‘perf_counter’QueryPerformanceCounter()✔️1e-07

其中,

  • 如果时钟可以自动更改或由系统管理员手动更改,则adjustable为True,否则为False。
  • implementation表示用于获取时钟值的基础C函数的名称。
  • 如果时钟不能倒退,则monotonic为 True,否则为 False 。
  • resolution表示以秒为单位的时钟分辨率。

接下来可以测试一下这些时钟的特性。

def test(n):
  aTime = time.time()
  aTh = time.thread_time()
  aPr = time.process_time()
  aMo = time.monotonic()
  aPe = time.perf_counter()
  for i in range(int(n)): j = i**2
  bTime = time.time()
  bTh = time.thread_time()
  bPr = time.process_time()
  bMo = time.monotonic()
  bPe = time.perf_counter()
  aStr = f'aTime={aTime},aTh={aTh},aPr={aPr},aMo={aMo},aPe={aPe}\n'
  bStr = f'bTime={bTime},bTh={bTh},bPr={bPr},bMo={bMo},bPe={bPe}'
  print(aStr+bStr)

下面是test函数的调用结果

>>> test(1e6)
aTime=1634625786.136904,aTh=0.03125,aPr=0.03125,aMo=199082.078,aPe=199085.4751224
bTime=1634625786.340363,bTh=0.234375,bPr=0.234375,bMo=199082.281,bPe=199085.6787309
>>> test(1e6)
aTime=1634625789.7817287,aTh=0.234375,aPr=0.234375,aMo=199085.734,aPe=199089.1195357
bTime=1634625789.981198,bTh=0.421875,bPr=0.421875,bMo=199085.921,bPe=199089.3195721
>>> test(1e6)
aTime=1634625796.3934195,aTh=0.421875,aPr=0.421875,aMo=199092.343,aPe=199095.731209
bTime=1634625796.5789576,bTh=0.609375,bPr=0.609375,bMo=199092.531,bPe=199095.9172852
>>>

可清晰地看到,在调用【test】的间隔中,thread_timeprocess_time并未发生变化,即二者不计算线程或者进程休眠时的时间。

一般在【time】模块中,最常用的两个函数分别是time.time()time.sleep(),前者用于获取时间戳,从而统计程序运行时长;后者则可以暂停线程。

可以通过time.thread_time()来检测sleep函数的功能

>>> def test(n):
...    aTime = time.time()
...    aTh = time.thread_time()
...    aPr = time.process_time()
...    time.sleep(n)
...    bTime = time.time()
...    bTh = time.thread_time()
...    bPr = time.process_time()
...    aStr = f'aTime={aTime},aTh={aTh},aPr={aPr}\n'
...    bStr = f'bTime={bTime},bTh={bTh},bPr={bPr}'
...    print(aStr+bStr)
...
>>> test(1)
aTime=1634649370.2819958,aTh=0.640625,aPr=0.640625
bTime=1634649371.2862759,bTh=0.640625,bPr=0.640625
>>> test(1)
aTime=1634649372.72013,aTh=0.640625,aPr=0.640625
bTime=1634649373.723695,bTh=0.640625,bPr=0.640625
>>> test(1)

时区概念

接下来需要介绍一些有关时间的概念

  • GMT:即格林威治标准时间。
  • UTC:世界协调时间,比格林威治更精确。
  • DST:D即Daylight,表示夏令时。
  • CST:美国、澳大利亚、中国、古巴的标准时间。

知道这些时区的概念之后,就能理解time中的常量:

常量altzonedaylighttznametimezone
时区偏移如未定义非DST时区,则为0时区名称本地时区偏移

struct_time

为了更好地表示时间,time中封装了struct_time类,其成员包括

索引属性含义
0tm_year正整数
1tm_monrange [1, 12]
2tm_mdayrange [1, 31]月中的日期
3tm_hourrange [0, 23]
4tm_minrange [0, 59]
5tm_secrange [0, 61]
6tm_wdayrange [0, 6],周一为 0星期即
7tm_ydayrange [1, 366]在一年中的第几天
8tm_isdst0, 1 或 -1是否为DST
-tm_zone时区名称的缩写
-tm_gmtoff以秒为单位的UTC以东偏离

在了解struct_time这一数据结构之后,就能读懂下列函数。

单参函数
gmtime(secs)将时间戳转化为UTC时间[struct_time格式]
localtime(secs)将戳转化为本地时间[struct_time格式]
ctime(secs)将时间戳转化为UTC时间字符串
asctime(secs)将时间结构体转化为本地时间字符串
mktimelocaltime的反函数,将struct_time转为秒数

格式化输出

可以将struct_time通过匹配符进行格式化输出,其转换格式为

名称含意名称含意
%a星期的缩写%A星期的名称
%b月份缩写%B月份名称
%c适当的日期和时间表示
%d月中日,范围[01,31]%j年中日,范围[001,366]
%H小时,范围[00,23]%I小时,范围[01,12]
%M分钟,范围[00,59]%S秒,范围[00,61]
%pAM 或 PM
%m月份,范围[01,12]
%U年中周数,范围[00,53]
周日作为第一天
%W同左,周一作为第一天
%w周中日,范围[0(星期日),6]
%x适当的日期表示%X适当的时间表示
%y无世纪年份,范围[00,99]%Y带世纪的年份
%z时区偏移
%Z时区名称
%%字面的 ‘%’ 字符。

strptime()为其反函数。

例如

>>> t = time.strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
>>> t
'Tue, 19 Oct 2021 13:46:37 +0000'
>>> T = time.strptime(t,"%a, %d %b %Y %H:%M:%S +0000")
>>> T
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=19, tm_hour=13, tm_min=46, tm_sec=37, tm_wday=1, tm_yday=292, tm_isdst=-1)
### 回答1: pythontime模块的struct_time是一个包含9个元素的元组,表示UTC时间下的时间信息,包括年、月、日、时、分、秒、一周的第几天、一年的第几天以及是否为夏令时。它经常用于表示和处理时间的相关数据。 ### 回答2: Pythontime.struct_time是一个表示时间的元组,它包含了一组用来表示时间的9个整型元素。这些元素分别表示年份、月份、日、小时、分钟、秒、一周的第几天、一年的第几天和夏令时。 struct_timePython内置的元组,常见的两种使用场景分别是获取当前时间和将时间戳转换为本地时间。 在获取当前时间方面,time模块提供了几个函数可以返回各种格式的时间信息。其最常用的是time.localtime()函数,它返回当前时间的struct_time格式,包含了九个整型元素,可以通过索引访问。 在将时间戳转换为本地时间方面,Pythontime模块还提供了time.gmtime()函数,它可以将时间戳转换为UTC时间,并返回struct_time格式的时间信息,此时的元素也可以通过索引访问。除此之外,time模块还有一些其他的类似函数可以完成时间的转换和处理,例如time.mktime()可以将本地时间转换为时间戳,time.strptime()可以将一个字符串按照指定格式转换为struct_time格式的时间信息等。 总之,Pythontime.struct_time是表示时间的一种数据类型,它可以用来获取时间信息、表示时间戳等,是Python处理时间相关操作的重要基础。 ### 回答3: Python time.struct_time时间元组类型,它表示时间值的一个结构体对象,包含9个元素,分别表示年、月、日、时、分、秒、一周的第几日、一年的第几日和夏令时状态。时间元组类型是Python标准库time模块所提供的一种时间处理方式。时间元组类型通常是由时间函数转换而成的,可用于表示日期、时间时间间隔等。 时间元组类型的元素可通过索引访问,从0开始到8结束,各元素的值的范围如下: 1. 年:1900年到9999年; 2. 月:1到12月; 3. 日:1到31日; 4. 时:0到23小时; 5. 分:0到59分; 6. 秒:0到61秒(闰秒); 7. 一周的第几日:0到6(0代表周日); 8. 一年的第几日:1到366日; 9. 夏令时状态:-1、0或1,-1表示夏令时是未知的,0表示夏令时未启用,1表示夏令时已启用。 Python标准库time模块提供了一些函数可以将时间值转换为时间元祖类型,例如gmtime()、localtime()、strptime()等,可以从时间戳、字符串和struct_time类型等转换为时间元祖类型。从时间元组类型转换为字符串、时间戳等也非常简单,可以使用strftime()、mktime()等函数实现。因此,时间元组类型在Python时间处理扮演着非常重要的角色,在时间日期的处理和计算非常实用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值