文章目录

  • 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部分:

  1. 需加时间戳的文件的摘要
  2. DTS收到文件的日期和时间
  3. 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系统中,第一次调用返回的是进程运行的实际时间,第二次之后的调用是自第一次调用后到现在的运行时间。

该函数有两个功能:

  1. 在第一次调用时,返回程序运行的实际时间
  2. 第二次之后的调用,返回自第一次调用后到这次调用的时间间隔

  在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)

  另外,还有两个较新的与时间相关的模块:datetimetimeit。前者提供了日期和时间算术支持,而后者可帮助你计算代码段的执行时间。