time模块
time模块对时间的表示方式:
- 时间戳: 1970-1-1 0:0:0到某一时间点之间的秒数
- UTC时间: 世界协调时,以英国格林威治所在的纵切面为标准时区,每隔15°角是一个时区,共24个时区.
- 9元组: (年,月,日,时,分,秒,一周中的第几天,一年中的第几天,是否为夏时制)
>>> import time
# 返回当前时间的9元组
>>> t = time.localtime()
>>> t
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=7, tm_hour=17, tm_min=14, tm_sec=25, tm_wday=3, tm_yday=311, tm_isdst=0)
# 返回格林威治0时区当前时间的9元组
>>> time.gmtime()
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=7, tm_hour=9, tm_min=15, tm_sec=10, tm_wday=3, tm_yday=311, tm_isdst=0)
# 常用,与1970-1-1 8:00之间的秒数,时间戳
>>> time.time()
1573118128.4677835
# 把9元组时间转成时间戳
>>> time.mktime(t)
1573118065.0
# 延迟1s
>>> time.sleep(1)
# 如果有参数就是9元组形式
>>> time.asctime()
'Thu Nov 7 17:20:51 2019'
# 返回当前时间,参数是时间戳,常用
>>> time.ctime()
'Thu Nov 7 17:20:58 2019'
# 常用 讲当前时间转化成指定的时间格式化
>>> time.strftime('%Y-%m-%d')
'2019-11-07'
>>> time.strftime('%Y-%m-%d %a %H:%M:%S')
'2019-11-08 Fri 09:30:34'
# 将指定时间转换成9元组时间格式
>>> time.strptime('2018-03-12','%Y-%m-%d')
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=71, tm_isdst=-1)
# 返回当前时间的datetime对象
>>> datetime.today()
datetime.datetime(2019, 11, 7, 17, 51, 42, 734337)
>>> datetime.now() # 同上,可用作时区参考
datetime.datetime(2019, 11, 7, 17, 51, 53, 174259)
# 返回datetime对象
>>> datetime.strptime('2018/06/12','%Y/%m/%d')
datetime.datetime(2018, 6, 12, 0, 0)
>>> dt = datetime.today()
>>> dt
datetime.datetime(2019, 11, 7, 17, 28, 25, 68553)
>>> datetime.ctime(dt)
'Thu Nov 7 17:28:25 2019'
>>> datetime.strftime(dt,'%Y%m%d')
'20191107'
# 时间的操作,计算时间差
>>> days = timedelta(days=90,hours=3)
>>> days
datetime.timedelta(90, 10800)
>>> dt2 = datetime.now()
>>> dt2 = dt + days
>>> dt2
datetime.datetime(2020, 2, 5, 20, 28, 25, 68553)
>>> dt2.year
2020
>>> dt2.month
2
>>> dt2.day
5
>>> dt2.hour
20
案例
在类似日志的文件取出固定时间段内的信息
[student@room9pc01 test]$ cat my.log
2019-05-15 08:10:01 aaaa
2019-05-15 08:32:00 bbbb
2019-05-15 09:01:02 cccc
2019-05-15 09:28:23 dddd
2019-05-15 10:42:58 eeee
2019-05-15 11:08:00 ffff
2019-05-15 12:35:03 gggg
2019-05-15 13:13:24 hhhh
现在我们要取出9;00~12:00之内的数据
每行的前19个字符表示的是该信息对应的时间,那么我们需要提取改时间,判断是否在时间范围内即可
import time
#创建指定的时间端
t9 = time.strptime('2019-5-15 09:00:00','%Y-%m-%d %H:%M:%S')
t12 = time.strptime('2019-5-15 12:00:00','%Y-%m-%d %H:%M:%S')
# with open('/tmp/test/my.log','r') as fobj:
# for line in fobj:
# t = time.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
# if t9 <= t <= t12: # 会将文件遍历完,会增加不必要的时间消耗
# print(line,end='')
with open('/tmp/test/my.log','r') as fobj:
for line in fobj:
# 读取文件中的每行的时间信息,并将时间格式转成9元组形式
t = time.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
if t > t12:
# 按时间记录的情况,如果时间已经大于了,那么后面的时间也必定会大于时间段,那么就没必要再去读取,节省程序运行时间
break
if t > t9:
print(line,end='')
from _datetime import datetime,timedelta
t9 = datetime.strptime('2019-5-15 09:00:00','%Y-%m-%d %H:%M:%S')
h = timedelta(hours = 2)
with open('/tmp/test/my.log','r') as fobj:
for line in fobj:
t = datetime.strptime(line[:19],'%Y-%m-%d %H:%M:%S')
if t > (t9 + h):
break
if t > t9:
print(line,end='')