time模块:
python中处理时间的基础模块,有时间戳,元组,自定义,三种时间表现形式。
python中时间戳的值是以1970年1月1日0点开始计算的,单位是秒。
时间戳:就是两个时间差的数值。
时区:传说中在开发服务器/客户端程序时,时区不一致,会影响 程序的功能。(以后再讨论)
time模块方法:
方法名 | 作用 | 示例 | 结果 |
time() | 返回当前时间戳 | time.time() | 1516071879.0688217 |
localtime(时间戳) | 返回时间戳的当前时区格式化元组 时间戳默认当前时间 | time.localtime() time.localtime(1516076520.4596064) | 与gmtime结果相同 |
gmtime(时间戳) | 返回时时间戳的0时区格式化元组 时间戳默认当前时间 | time.gmtime() time.gmtime(1516076520.4596064) | time.struct_time(tm_year=2018, tm_mon=1, tm_mday=16, tm_hour=4, tm_min=22, tm_sec=0, tm_wday=1, tm_yday=16, tm_isdst=0) |
altzone | 返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。 | time.altzone | 返回一个整数 |
tzset() | 使用环境变量TZ的值,重新初始化时间相关设置。无返回值。 | time.tzset() | 无返回值,打印时间显示TZ更改后的结果 |
TZ环境变量的设置 | 格式:std offset [dst [offset [,start[/time], end[/time]]]]
| os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0' | 打印时间 05:00:40 02/18/09 AEDT |
timezone | 属性time.timezone是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。 | time.timezone | |
tzname | 属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。 | time.tzname | |
asctime(时间元组) | 返回一个固定格式的时间 时间格式是元组格式 默认以time.localtime()为参数返回当前时间 | time.asctime() 或: time.asctime((2018, 1, 16, 4, 22, 0, 1, 16, 0)) | Tue Jan 16 07:19:10 2018 |
ctime(时间戳) | 返回一个固定格式的时间,与asctime格式相同 时间格式是时间戳 默认以time.time()为参数,返回当前时间 | time.ctime() 或 time.ctime(1516076520.4596064) | Tue Jan 16 04:22:00 2018 |
mktime(时间元组) | 返回时间戳,不可缺省参数 把时间元组转变成时间戳,精确到秒 | mktime((2018, 1, 16, 4, 22, 0, 1, 16, 0))
| 1516076520.0 |
clock() | 返回当前cpu的时间,用于计算程序的耗时,浮点型;不受time.sleep影响。 Windows下,在第一次调用的时候,返回的是程序运行的实际时间;以第二次之后的调用,返回的是自第一次调用后,到这次调用的时间间隔 在Unix/Linux下返回的是CPU时间 | time.clock() | 返回一个时间戳,例如: 0.022192 |
sleep(秒数) | 推迟调用线程的运行,可通过参数指定秒数,表示进程挂起的时间。 | a = time.time() time.sleep(10) print(time.time()-a) | 10.004650831222534 因为包含了指今运行时间,所以有小数产生 |
strftime(格式,时间元组) | 把时间元组转变成指定格式 格式相当于当格式化字符串的使用 时间元组可以是localtime和gmtime提供
| time.strftime('哈哈,这是一个时间%Y-%m?随便写点%d',((018, 1, 16, 4, 22, 0, 1, 16, 0)) | 哈哈,这是一个时间2018-01?随便写点16 |
strptime(字符串,格式) | 根据指定的格式把一个时间字符串解析为时间元组。 通常把字符串里指定位置的值用%替代掉 | time.strptime('哈哈,这是一个时间2018-01?随便写点16','哈哈,这是一个时间%Y-%m?随便写点%d') | time.struct_time(tm_year=2018, tm_mon=1, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=16, tm_isdst=-1) |
各方法关系图:
时间元组的格式说明:
(2018, 1, 16, 4, 22, 0, 1, 16, 0)
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=16, tm_hour=4, tm_min=22, c=0, tm_wday=1, tm_yday=16, tm_isdst=0)
元组序号 | struct_time名 | 值 | 说明 | 对应格式化符号 |
0 | tm_year | 2018 | tm_year(年) 比如2011 | %Y或%y |
1 | tm_mon | 1 | tm_mon(月) 1 - 12 | %m |
2 | tm_mday | 16 | tm_mday(日) 1 - 31 | %d |
3 | tm_hour | 4 | tm_hour(时) 0 - 23 | %H |
4 | tm_min | 22 | tm_min(分) 0 - 59 | %M |
5 | c | 0 | tm_sec(秒) 0 - 61 | %S |
6 | tm_wday | 1 | tm_wday(weekday) 0 - 6(0表示周日) | %w |
7 | tm_yday | 16 | tm_yday(一年中的第几天) 1 - 366 | %j |
8 | tm_isdst | 0 | tm_isdst(是否是夏令时) 默认为-1 | |
备注: 读取某一属性 time.gmtime().tm_year 或 time.gmtime()[0] |
格式化符号含义说明
格式 | 含义 | 备注 |
---|---|---|
%a | 本地(locale)简化星期名称 | |
%A | 本地完整星期名称 | |
%b | 本地简化月份名称 | |
%B | 本地完整月份名称 | |
%c | 本地相应的日期和时间表示 | |
%d | 一个月中的第几天(01 - 31) | |
%H | 一天中的第几个小时(24小时制,00 - 23) | |
%I | 第几个小时(12小时制,01 - 12) | |
%j | 一年中的第几天(001 - 366) | |
%m | 月份(01 - 12) | |
%M | 分钟数(00 - 59) | |
%p | 本地am或者pm的相应符 | 1 |
%S | 秒(01 - 61) | 2 |
%U | 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 | 3 |
%w | 一个星期中的第几天(0 - 6,0是星期天) | 3 |
%W | 和%U基本相同,不同的是%W以星期一为一个星期的开始。 | |
%x | 本地相应日期 | |
%X | 本地相应时间 | |
%y | 去掉世纪的年份(00 - 99) | |
%Y | 完整的年份 | |
%Z | 时区的名字(如果不存在为空字符) | |
%% | ‘%’字符 |
备注:
“%p”只有与“%I”配合使用才有效果。
文档中强调确实是0 - 61,而不是59,闰年秒占两秒(汗一个)。
当使用strptime()函数时,只有当在这年中的周数和天数被确定的时候%U和%W才会被计算。
一些例子:
1、当时时间的前三天
#方法一:时间戳上加减一天的时间间隔:86400秒
import time
print(time.ctime(time.time()-86400*3))
#方法二:把当前时间转换成元组,再转换成列表(可修改),修改后再改回元组
import time
aa = list(time.gmtime())
aa[2] -= 3
aa = tuple(aa)
print(time.asctime(aa))
2、给定元组格式转换时间戳
a = (2018, 1, 16, 4, 22, 0, 1, 16, 0)
print(time.mktime(a))
3、常用时间格式:
now_tuple = time.gmtime()
split_1 = time.strftime("%Y/%m/%d %H:%M:%S", now_tuple)
split_2 = time.strftime("%Y-%m-%d %H:%M:%S", now_tuple)