文章目录
- 5. time
- (1) 时间戳
- (2) 时间格式化符号
- (3) struct_time元组
- (4)三种时间格式转化
- 6. time模块
- (1) time()函数
- (2) asctime([tuple])函数
- (3) localtime([secs])函数
- (4) gmtime([secs])函数
- (5) mktime(tuple)函数
- (6) ctime([secs])函数
- (7) sleep(secs)函数
- (8) clock()函数
- (9) strftime(format[,t])函数
- (10) strptime(string[, format])函数
5. time
在Python中,通常用时间戳、格式化的时间字符串和元组3种方式表示时间。
(1) 时间戳
时间戳表示从1970年1月1日00时00分00秒开始按秒计算的偏移量,也就是从1970年1月1日00时00分00秒起到现在的总毫秒数。
时间戳是一个经加密后形成的凭证文档,包括3部分:
- 需加时间戳的文件的摘要
- DTS收到文件的日期和时间
- DTS的数字签名
一般来说,时间戳产生的过程为:用户首先将需要加时间戳的文件用Hash编码加密形成摘要,然后将摘要发送到DTS,DTS加入收到文件摘要的日期和时间信息后再对该文件加密(数字签名),最后送回用户。
书面签署文件的时间是由签署人自己写上的,而数字时间戳是由认证单位DTS添加的,以DTS收到文件的时间为依据。
(2) 时间格式化符号
在Python中,一般用表所示的格式化符号对时间进行格式化。
表 Python格式化符号
格式 | 含义 备注 |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化月份名称 |
%B | 本地完整月份名称 |
%c | 本地相应的日期和时间表示 |
%d | 一个月中的第几天(01-31) |
%H | 一天中的第几个小时(00-23) |
%I | 第几个小时(01-12) |
%j | 一年中的第几天(001-366) |
%m | 月份(01-12) |
%M | 分钟数(00-59) |
%p | 本地AM或PM的相应符 |
%S | 秒(01-61) |
%U | 一年中的星期数(00-53,星期天为一天的开始,第一个星期天之前的所有天数都放在第0周) |
%w | 一个星期中的第几天(0-6,0是星期天) |
%W | 和%U基本相同,不同的是%W以星期一为一个星期的开始 |
%x | 本地相应日期 |
%X | 本地相应时间 |
%y | 去掉世纪的年份(00-99) |
%Y | 完整的年份 |
%Z | 时区的名字(如果不存在为空字符) |
%% | %字符 |
1:%p只有与%I配合使用才有效果
2:文档中强调确实是0-61,而不是59,闰年秒占两秒
3:当使用strtime()函数时,只有这一年的周数和天数确定时%U和%W才会被计算。
(3) struct_time元组
struct_time元组共有9个元素。
序号 | 属性 | 字段 | 值 |
0 | tm_year | 4位数年 | 最大为3001 |
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(60或61是闰秒) |
6 | tm_wday | 一周的第几日 | 0-6(0是周一) |
7 | tm_yday | 一年的第几日 | 1-366(偏略历) |
8 | tm_isdst | 夏令时 | -1、0、1,-1是决定是否为夏令时的旗帜 |
(4)三种时间格式转化
这3种时间格式可以相互转化。
6. time模块
模块time包含用于获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为字符串的函数。
日期可表示为实数(从“新纪元”1月1日0时起过去的秒数。“新纪元”是一个随平台而异的年份,在UNIX中为1970年),也可表示为包含9个整数的元组。
例如,元组(2008, 1, 21, 12, 2, 56, 0, 21, 0)表示2008年1月21日12时2分56秒。这一天是星期一,2008年的第21天(不考虑夏令时)
夏令时数字是一个布尔值(True或False),但如果你使用-1,那么mktime
[将时间元组转换为时间戳的函数]可能得到正确的值。表10-7描述了模块time中一些最重要的函数。
表10-7 模块time中一些重要的函数
函数 | 描 述 |
time() | 返回当前时间的时间戳 |
asctime([tuple]) | 将时间元组转换为字符串 |
localtime([secs]) | 将一个实数转换为日期元组 |
gmtime([secs]) | 将一个实数转换为UTC时区的struct_time |
mktime(tuple) | 将日期元组转换为实数 |
ctime([secs]) | 把一个时间戳转化为time.asctime()的形式 |
sleep(secs) | 休眠(什么都不做)secs秒 |
clock() | 以浮点数计算的秒数返回当前CPU时间 |
strftime(format[,t]) | 把时间元组转换为以可读字符串表示的当地时间,格式由参数format决定。 |
strptime(string[, format]) | 将字符串转换为时间元组 |
(1) time()函数
函数time()
返回当前时间的时间戳。虽然新纪元随平台而异,但可这样进行可靠的计时:存储事件(如函数调用)发生前后time的结果,再计算它们的差。
>>> time.time()
1541227653.779159
(2) asctime([tuple])函数
函数time.asctime()
将时间元组转换为一个字符串,默认使用当前时间,如下所示:
>>> time.asctime() #'Mon Jul 18 14:06:07 2016'
如果不想使用当前时间,也可向它提供一个日期元组(如localtime创建的日期元组)。
(3) localtime([secs])函数
函数localtime()
将一个时间戳转换为日期元组(本地时间)。该函数没有任何返回值。如果要转换为国际标准时间,应使用gmtime
。
>>> print(time.localtime())
#time.struct_time(tm_year=2018, tm_mon=11, tm_mday=3, tm_hour=14, tm_min=48, tm_sec=58, tm_wday=5, tm_yday=307, tm_isdst=0)
>>> localtime(1483200000.0)
#time.struct_time(tm_year=2017, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=1, tm_isdst=0)
(4) gmtime([secs])函数
gmtime()
用于将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1到现在的秒数。gmtime()函数的默认值为time.time(),函数返回time.struct_time类型的对象。该函数没有任何返回值。
>>> time.gmtime()
#time.struct_time(tm_year=2018, tm_mon=11, tm_mday=3, tm_hour=6, tm_min=56, tm_sec=9, tm_wday=5, tm_yday=307, tm_isdst=0)
(5) mktime(tuple)函数
函数mktime(tuple)
将日期元组转换为用秒数表示时间的浮点数,这与localtime、gmtime()的功能相反。如果输入的值不是合法时间,就会触发OverflowError或ValueError。
返回用秒数表示时间的浮点数。
>>> a=(2008, 1, 21, 12, 2, 56, 0, 21, 0)
>>> time.mktime(a)
#1200888176.0
(6) ctime([secs])函数
ctime()函数
用于把一个时间戳转化为time.asctime()
的形式,如果未指定参数secs
或参数为None,就会默认将time.time()作为参数。ctime()的作用相当于asctime(localtime(secs))。
此函数没有任何返回值。
>>> print(time.ctime())
#Sat Nov 3 15:06:12 2018
(7) sleep(secs)函数
函数sleep(secs)
让解释器等待指定的秒数。用于推迟调用线程的运行,可通过参数secs
指定进程挂起的时间。
>>> time.sleep(5) #等了5秒
(8) clock()函数
clock()
用于以浮点数计算的秒数返回当前CPU时间,用来衡量不同程序的耗时,比time.time()
更有用。该函数在不同系统上含义不同。在UNIX系统上,返回的是进程时间,是时间戳;在Windows系统中,第一次调用返回的是进程运行的实际时间,第二次之后的调用是自第一次调用后到现在的运行时间。
该函数有两个功能:
- 在第一次调用时,返回程序运行的实际时间
- 第二次之后的调用,返回自第一次调用后到这次调用的时间间隔
在Win32系统下,clock()函数返回的是真实时间,而在UNIX/Linux下返回的是CPU时间。
使用示例如下:
import time
def procedure():
time.sleep(2)
# measure process time
t1 = time.clock()
procedure()
print('seconds process time :', time.clock() - t1)
# measure wall time
t2 = time.time()
procedure()
print('seconds wall time :', time.time() - t2)
结果如下:
seconds process time : 2.009384463232334
seconds wall time : 2.0004351139068604
(9) strftime(format[,t])函数
strftime()函数
用于接收时间元组,并返回以可读字符串表示的当地时间,格式由参数format
决定。
>>> print(time.strftime('%b %d %Y %H:%M:%S',time.gmtime(t)))
#Sep 25 2016 09:50:38
(10) strptime(string[, format])函数
函数strptime()
将一个字符串(其格式与asctime所返回字符串的格式相同)转换为日期元组。
>>> time.strptime('Mon Jul 18 14:06:07 2016')
time.struct_time(tm_year=2016, tm_mon=7, tm_mday=18, tm_hour=14, tm_min=6, tm_sec=7, tm_wday=0, tm_yday=200, tm_isdst=-1)
根据指定的格式把一个时间字符串解析为时间元组。
>>> struct_time = time.strptime("25 Sep 16", "%d %b %y")
>>> print(struct_time)
time.struct_time(tm_year=2016, tm_mon=9, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=269, tm_isdst=-1)
另外,还有两个较新的与时间相关的模块:datetime
和timeit
。前者提供了日期和时间算术支持,而后者可帮助你计算代码段的执行时间。