Python进阶教程m5–时间,日期

原文链接:http://www.juzicode.com/archives/839

1 time模块

time模块有2种重要的时间数据类型,一种是典型的浮点数据,表示从epoch开始走过的秒数;另外一种是struct_time数据类型,struct_time是一种named tuple类型的数据,既可以通过下标访问元素也可以通过属性名来访问,它的结构是这样的:

索引属性
0tm_year4位数字,比如2020
1tm_mon范围[1, 12]
2tm_mday 范围 [1, 31]
3tm_hour 范围 [0, 23]
4tm_min 范围 [0, 59]
5tm_sec 范围 [0, 61]
6tm_wday 范围 [0, 6], 周一是 0
7tm_yday 范围 [1, 366]
8tm_isdst0, 1 or -1
N/Atm_zone时区缩写
N/Atm_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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注