补充知识
夏令时
夏令时,是一种为节约能源而人为规定地方时间的制度。也叫夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。我国1992年起,夏令时暂停实行。
UTC
UTC(Coordinated Universal Time,世界协调时)也叫格林威治天文时间,是世界标准时间。在中国为 UTC+8 。
1、三种时间表示形式
在python3中时间有三种表示方式:时间戳、元组(struct_time)、格式化时间字符串:
1.1 时间戳(timestamp):
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
通过time.time()获取当前时间戳:
1 >>> import time 2 >>> ticks=time.time() 3 >>> ticks 4 1566286317.9938319 5 >>> ticks/3600/24/365+1970 6 2019.666613330601
1.2 时间元组(struct_time):
struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
属性(Attribute) | 值(value) |
tm_year(年) | 比如2019 |
tm_mon(月) | 1-12 |
tm_mday(日) | 1-31 |
tm_hour(时) | 0-23 |
tm_min(分) | 0-59 |
tm_sec(秒) | 0-61(注1:60 代表闰秒,61 是基于历史原因保留。) |
tm_wday(weekday) | 0-6(0表示周一) |
tm_yday(一年中的第几天) | 1-366 |
tm_isdst(是否是夏令时) | 1(夏令时),0(非夏令时),-1(未知,默认) |
可以使用 time.localtime() 获取当前时间元组,元组用于装载当前的时间信息,
1 >>> time.localtime() 2 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=15, tm_min=46, tm_sec=24, tm_wday=1, tm_yday=232, tm_isdst=0)
1.3 格式化时间
对于时间元组的格式化,可以使用 time.asctime() 或 time.strptime() 函数获取时间元组的格式化输出;
%Y | 四位数的年份表示(000-9999) | %y | 两位数的年份表示(00-99) |
%m | 月份(01-12) | %d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) | %I | 12小时制小时数(01-12) |
%M | 分钟数(00-59) | %S | 秒(00-59) |
%p | 本地化的 AM,PM | %w | 一周中的第几天(0-6,0为周日) |
%a | 本地简化星期名称,如:Mon | %A | 本地完整星期名称,如:Monday |
%b | 本地简化的月份名称,如:Jan | %B | 本地完整的月份名称,如:January |
%j | 年内的一天(001-366) | %U | 一年中的星期数(00-53),周日为起始 |
%c | 本地相应的日期表示和时间表示; 等同于:%a %b %d %H:%M%S %Y 如:Thu Jan 25 01:22:04 2018 |
%Z | 当前时区的名称 |
%x | 本地相应的日期表示; 等同于:%d/%m/%y 如:01/25/18 |
%X | 本地相应的时间表示; 等同于:%H:%M%S 如:01:32:46 |
1 # 快速格式化时间输出 2 >>> time.asctime(time.localtime()) 3 'Tue Aug 20 16:08:57 2019' 4 # 时间对象转化为格式化字符串 5 >>> time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 6 '2019-08-20 16:09:40'
2、time模块常用方法
线程相关
(1)time.sleep(sec) 推迟线程的运行时间,通过参数sec指定秒数,表示线程挂起时间
1 import time 2 print('start:', time.localtime()) 3 time.sleep(5) 4 print('stop:', time.localtime()) 5 输出: 6 start: time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=19, tm_sec=10, tm_wday=1, tm_yday=232, tm_isdst=0) 7 stop: time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=19, tm_sec=15, tm_wday=1, tm_yday=232, tm_isdst=0)
时间操作相关
(2)time.time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
(3)*time.clock() 用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。(time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8)
不建议使用
(4) *time altzone() 函数返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
(5)time.gmtime([secs]) 函数将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1以来的秒数。其默认值为time.time(),函数返回time.struct_time类型的对象。(struct_time是在time模块中定义的表示时间的对象)。我国时间是东8区,比0时区时间早了8个小时。
1 import time 2 print(time.localtime())# 本地时区时间 3 print(time.gmtime())# UTC时区(0时区)时间 4 输出>>> 5 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=39, tm_sec=5, tm_wday=1, tm_yday=232, tm_isdst=0) 6 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=8, tm_min=39, tm_sec=5, tm_wday=1, tm_yday=232, tm_isdst=0)
(6)time.asctime([t]) 函数接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
1 import time 2 t=time.localtime() 3 print(t) 4 print(time.asctime(t)) 5 输出>>> 6 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=46, tm_sec=16, tm_wday=1, tm_yday=232, tm_isdst=0) 7 Tue Aug 20 16:46:16 2019
(7)time.ctime([sec]) 函数把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。 如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于 asctime(localtime(secs))。
1 import time 2 print(time.ctime()) 3 >>> 4 Tue Aug 20 16:51:55 2019
(8) time.mktime(tupletime) 接受时间元组并返回时间辍(1970纪元后经过的浮点秒数)。
1 import time 2 t = time.localtime() 3 print(t) 4 print(time.mktime(t)) 5 >>> 6 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=54, tm_sec=53, tm_wday=1, tm_yday=232, tm_isdst=0) 7 1566291293.0
(9) time.strftime(format,[t]) t -- 可选的参数t是一个struct_time对象,默认为此刻时间
接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。
1 import time 2 t = time.localtime() 3 print(t) 4 print(time.strftime("%Y-%m-%d %H:%M:%S")) 5 print(time.strftime("%Y-%m-%d %H:%M:%S",t)) 6 >>> 7 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=17, tm_min=1, tm_sec=19, tm_wday=1, tm_yday=232, tm_isdst=0) 8 2019-08-20 17:01:19 9 2019-08-20 17:01:19
(10)time.strptime(str,format) 函数根据指定的格式把一个时间字符串解析为时间元组。
1 import time 2 struct_time = time.strptime('2019-8-20 17:07:25', '%Y-%m-%d %H:%M:%S') 3 print(struct_time) 4 >>> 5 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=20, tm_hour=17, tm_min=7, tm_sec=25, tm_wday=1, tm_yday=232, tm_isdst=-1)
(11)time.perf_counter() 返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。
1 import time 2 def test(): 3 time.sleep(2) 4 print('in the test') 5 print('start:',time.perf_counter()) 6 test() 7 print('stop:',time.perf_counter()) 8 >>> 9 start: 0.023112338 10 in the test 11 stop: 2.022961182
(12) time.process_time()
返回当前进程执行 CPU 的时间总和,不包含睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。
3、三种格式的转换
time.localtime([secs]) | 接收时间辍(1970 纪元年后经过的浮点秒数)并返回当地时间下的时间元组 t(t.tm_isdst 可取 0 或 1,取决于当地当时是不是夏令时) |
time.strftime(format[, t]) | 把一个代表时间的元组或者 struct_time(如由 time.localtime() 和 time.gmtime() 返回)转化为格式化的时间字符串。如果 t 未指定,将传入 time.localtime()。如果元组中任何一个元素越界,将会抛出 ValueError 异常。 |
time.gmtime([secs]) | 接收时间辍(1970 纪元年后经过的浮点秒数)并返回格林威治天文时间下的时间元组 t(注:t.tm_isdst 始终为 0) |
time.strptime(string[, format]) | 把一个格式化时间字符串转化为 struct_time。实际上它和 strftime() 是逆操作。 |