原文链接:http://www.juzicode.com/archives/839
1 time模块
time模块有2种重要的时间数据类型,一种是典型的浮点数据,表示从epoch开始走过的秒数;另外一种是struct_time数据类型,struct_time是一种named tuple类型的数据,既可以通过下标访问元素也可以通过属性名来访问,它的结构是这样的:
索引 | 属性 | 值 |
0 | tm_year | 4位数字,比如2020 |
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] |
6 | tm_wday | 范围 [0, 6], 周一是 0 |
7 | tm_yday | 范围 [1, 366] |
8 | tm_isdst | 0, 1 or -1 |
N/A | tm_zone | 时区缩写 |
N/A | tm_gmtoff | 偏移UTC东部的秒数 |
1.1 time.sleep(interval) 延时interval秒
利用time.sleep()函数可以实现延时功能,interval单位是s,浮点类型,表示延时的时长。
print('延时2s前......')
time.sleep(2)
print('延时2s结束')
==========结果:
延时2s前......
延时2s结束
1.2 获取从epoch开始的秒数time.time()
获取从epoch(January 1, 1970, 00:00:00 (UTC))开始的秒数:
print('time.time():',time.time())
==========结果:
time.time(): 1594391129.8763058
1.3 epoch秒数和struct_time相互转换
输入 | 输出 | |
gmtime() | 从epoch开始的秒数 | UTC struct_time |
localtime() | 从epoch开始的秒数 | 本地struct_time |
calendar.timegm() | UTC struct_time | 从epoch开始的秒数 |
mktime() | 本地struct_time | 从epoch开始的秒数 |
gmtime() 和 localtime() 如果不带epoch开始的秒数,就默认使用time.time()获取的当前秒数。 mktime() 必须带入参。
print('获取UTC时间:')
print('time.gmtime():',time.gmtime())
print('获取本地时间:')
print('time.localtime():',time.localtime())
print('epoch为0的时间:')
print('time.gmtime(0):',time.gmtime(0))
print('time.localtime(0):',time.localtime(0))
print('本地时间转换为epoch秒数')
b = time.localtime()
print('time.mktime():',time.mktime(b))
==========结果:
获取UTC时间:
time.gmtime(): time.struct_time(tm_year=2020, tm_mon=7, tm_mday=10, tm_hour=14, tm_min=25, tm_sec=29, tm_wday=4, tm_yday=192, tm_isdst=0)
获取本地时间:
time.localtime(): time.struct_time(tm_year=2020, tm_mon=7, tm_mday=10, tm_hour=22, tm_min=25, tm_sec=29, tm_wday=4, tm_yday=192, tm_isdst=0)
epoch为0的时间:
time.gmtime(0): time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
time.localtime(0): time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
本地时间转换为epoch秒数
1.4 标准格式字符串转换
time.asctime()
输入为struct_time,转换为类似'
Tue Jul 21 01:16:45 2020'
的字符串形式,日期字段的长度为两个字符,如果只有一位长度则会以空字符填充。
如果输入为None或者无输入,转换当前获取的struct_time进行转换。
b = time.localtime()
print('time.asctime():',time.asctime(b))
==========结果:
time.asctime(): Fri Jul 10 22:25:29 2020
time.ctime()
输入为epoch开始的秒数,转换为类似'
Tue Jul 21 01:16:45 2020'
的字符串形式。
如果输入为None或者无输入,转换当前获取的epoch秒数进行转换。
c=time.time()
print('time.ctime():',time.ctime(c))
==========结果:
time.ctime(): Fri Jul 10 22:25:29 2020
1.5 自定义格式字符串转换
使用asctime()或者ctime()可以转换为特定格式的时间字符串,如果想输出自定义格式的时间字符串,则可以使用到格式化指令进行转换:
指令 | 含义 | 注释 |
%a | 本地化的缩写星期中每日的名称。 | |
%A | 本地化的星期中每日的完整名称。 | |
%b | 本地化的月缩写名称。 | |
%B | 本地化的月完整名称。 | |
%c | 本地化的适当日期和时间表示。 | |
%d | 十进制数 [01,31] 表示的月中日。 | |
%H | 十进制数 [00,23] 表示的小时(24小时制)。 | |
%I | 十进制数 [01,12] 表示的小时(12小时制)。 | |
%j | 十进制数 [001,366] 表示的年中日。 | |
%m | 十进制数 [01,12] 表示的月。 | |
%M | 十进制数 [00,59] 表示的分钟。 | |
%p | 本地化的 AM 或 PM 。 | 当与 strptime() 函数一起使用时,如果使用 %I 指令来解析小时, %p 指令只影响输出小时字段 |
%S | 十进制数 [00,61] 表示的秒。 | 支持闰秒 |
%U | 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)作为。在第一个星期日之前的新年中的所有日子都被认为是在第0周。 | 当与 strptime() 函数一起使用时, %U 和 %W 仅用于指定星期几和年份的计算 |
%w | 十进制数 [0(星期日),6] 表示的周中日。 | |
%W | 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第0周。 | 当与 strptime() 函数一起使用时, %U 和 %W 仅用于指定星期几和年份的计算 |
%x | 本地化的适当日期表示。 | |
%X | 本地化的适当时间表示。 | |
%y | 十进制数 [00,99] 表示的没有世纪的年份。 | |
%Y | 十进制数表示的带世纪的年份。 | |
%z | 时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, +23:59] 。 | |
%Z | 时区名称(如果不存在时区,则不包含字符)。 | |
%% | 字面的 ‘%’ 字符。 |
time.strftime()
使用strftime()函数可以将struct_time转换为自定义格式的时间字符串,第1个参数是格式化方法,第2个参数是struct_time:
print('自定义格式化')
c=time.localtime()
print(time.strftime("%Y-%m-%d-%H:%M:%S", c))
print(time.strftime("%Y,%m,%d %H:%M:%S", c))
==========结果:
自定义格式化
2020-07-10-22:25:29
2020,07,10 22:25:29
time.strptime()
使用strftime()函数可以将自定义格式的时间字符串转换为struct_time,第1个参数是格式化字符串,第2个参数是格式化方法:
print('格式化时间转struct_time')
x='2019-01-02-22:20:33'
s=time.strptime(x,'%Y-%m-%d-%H:%M:%S')
print(s)
x='2019,01,02 22:20:33'
s=time.strptime(x,'%Y,%m,%d %H:%M:%S')
print(s)
==========结果:
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=2, tm_hour=22, tm_min=20, tm_sec=33, tm_wday=2, tm_yday=2, tm_isdst=-1)
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=2, tm_hour=22, tm_min=20, tm_sec=33, tm_wday=2, tm_yday=2, tm_isdst=-1)
2 datetime
2.1获取当前时间 datetime.now()
获取本地时间,精确到微秒。
import datetime
now = datetime.datetime.now()#系统当前时间
print('datetime.datetime:',datetime.datetime)
print('datetime.datetime.now():',now)
==========结果:
datetime.datetime: <class 'datetime.datetime'>
datetime.datetime.now(): 2020-07-21 21:37:33.407732
2.2 获取datetime数据的日期和时分秒:date(),time()
import datetime
now = datetime.datetime.now()#系统当前时间
print('datetime.datetime:',datetime.datetime)
print('datetime.datetime.now():',now)
print('datetime.datetime.date():',now.date())#当前时间的日期
print('datetime.datetime.time():',now.time())#当前时间的时分秒
==========结果:
datetime.datetime: <class 'datetime.datetime'>
datetime.datetime.now(): 2020-07-21 21:37:33.407732
datetime.datetime.date(): 2020-07-21
datetime.datetime.time(): 21:37:33.407732
2.3 转换为时间字符串: ctime(),strftime()
datetime.strftime()使用的字符串格式指令参照 time.strftime()。
import datetime
now = datetime.datetime.now()#系统当前时间
print('datetime.datetime.ctime():',now.ctime())#转化成标准格式时间字符串
print('datetime.datetime.strftime():',now.strftime('%Y-%m-%d-%H:%M:%S'))#转换为自定义格式时间字符串
==========结果:
datetime.datetime.date(): 2020-07-21
datetime.datetime.time(): 21:37:33.407732
2.4 时间字符串转换为datetime类型:strptime()
datetime.strptime()使用的字符串格式指令参照time.strptime()。
import datetime
tm = datetime.datetime.strptime('2020-1-20-14-42-36','%Y-%m-%d-%H-%M-%S')
print('type of tm:',type(tm))
print('datetime.datetime.strptime():',tm)
==========结果:
type of tm: <class 'datetime.datetime'>
datetime.datetime.strptime(): 2020-01-20 14:42:36