Python时间和日期库的实现
在Python中是没有原生数据类型支持时间的,日期与时间的操作需要借助三个模块,分别是time、datetime、calendar。
- time模块可以操作C语言库中的时间相关函数,时钟时间与处理器运行时间都可以获取。
- datetime模块提供了日期与时间的高级接口。
- calendar模块为通用日历相关函数,用于创建数周、数月、数年的周期性事件。
在学习之前,还有一些术语要补充一下,这些术语你当成惯例即可。这里在Python官方文档中也有相关说明,不过信息比较多,橡皮擦为你摘录必须知道的一部分。
epoch(纪元)是时间开始的点,其值取决于平台。
对于Unix,epoch(纪元)是1970年1月1日00:00:00(UTC)。要找出给定平台上的epoch,请使用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)
术语纪元秒数是指自epoch(纪元)时间点以来经过的总秒数,通常不包括闰秒。在所有符合POSIX标准的平台上,闰秒都不会记录在总秒数中。
程序员中常把纪元秒数称为时间戳。
time时间模块
该模块核心为控制时钟时间。
get_clock_info函数
该函数获取时钟的基本信息,得到的值因不同系统存在差异,函数原型比较简单:
time.get_clock_info(name)
其中name可以取下述值:
- monotonic:time.monotonic()
- perf_counter:time.perf_counter()
- process_time:time.process_time()
- thread_time:time.thread_time()
- time:time.time()
该函数的返回值具有以下属性:
- adjustable:返回True或者False。如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,则为True,否则为False;
- implementation:用于获取时钟值的基础C函数的名称,就是调用底层C的函数;
- monotonic:如果时钟不能倒退,则为True,否则为False;
- resolution:以秒为单位的时钟分辨率(float)。
importtime available_clocks=[ ('clock',time.clock), ('monotonic',time.monotonic), ('perf_counter',time.perf_counter), ('process_time',time.process_time), ('time',time.time), ] forclock_name,funcinavailable_clocks: print(''' {name}: adjustable:{info.adjustable} implementation:{info.implementation} monotonic:{info.monotonic} resolution:{info.resolution} current:{current} '''.format( name=clock_name, info=time.get_clock_info(clock_name), current=func()))
运行结果如下图所示。
上图显示橡皮擦的计算机在clock与perf_counter中,调用底层C函数是一致的。
获取时间戳
在Python中通过time.time()函数获取纪元秒数,它可以把从epoch开始之后的秒数以浮点数格式返回。
importtime print(time.time()) #输出结果1615257195.558105
时间戳大量用于计算时间相关程序,属于必须掌握内容。
获取可读时间
时间戳主要用于时间上的方便计算,对于人们阅读是比较难理解的,如果希望获取可读时间,使用ctime()函数获取。
importtime print(time.ctime()) #输出内容:TueMar910:35:512021
如何将时间戳转换为可读时间,使用localtime函数即可。
localtime=time.localtime(time.time()) print("本地时间为:",localtime)
输出结果为
本地时间为:time.struct_time(tm_year=2021,tm_mon=3,tm_mday=9,tm_hour=10,tm_min=37,tm_sec=27,tm_wday=1,tm_yday=68,tm_isdst=0)
上述代码中的时间戳最小值是0,最大值由于Python环境和操作系统决定,我本地64位操作系统进行测试的时候,得到的数据如下:
importtime localtime=time.localtime(0) print("时间为:",localtime) #时间为: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) localtime=time.localtime(32536799999) print("时间为:",localtime) #时间为:time.struct_time(tm_year=3001,tm_mon=1,tm_mday=19,tm_hour=15,tm_min=59,tm_sec=59,tm_wday=0,tm_yday=19,tm_isdst=0) localtime=time.localtime(99999999999) print("时间为:",localtime) #OSError:[Errno22]Invalidargument print(type(localtime))
单调时间monotonictime
monotonictime从系统启动开始计时,从0开始单调递增。
操作系统的时间可能不是从0开始,而且会因为时间出错而回调。
该函数原型如下,不需要任何参数,返回一个浮点数,表示小数秒内的单调时钟的值:
time.monotonic()
测试代码如下:
print("单调时间",time.monotonic()) #输出:单调时间12279.244
处理器时钟时间
time()函数返回的是纪元秒数(时间戳),clock()函数返回的是处理器时钟时间。
该函数函数的返回值:
- 在第一次调用的时候,返回的是程序运行的实际时间;
- 在第二次之后的调用,返回的是自第一次调用后到这次调用的时间间隔。
需要注意的是Python3.8已移除clock()函数,用time.perf_counter()或time.process_time()方法替代。
t0=time.clock() #运行一段代码 print(time.clock()-t0,"程序运行时间")
我使用的Python版本较高,提示异常如下:
time.clockhasbeendeprecatedinPython3.3andwillberemovedfromPython3.8:usetime.perf_counterortime.process_timeinsteadt0=time.clock()
性能计数器time.perf_counter
perf_counter()函数的epoch(纪元)是未定义的。一般使用该函数都是为了比较和计算,不是为了用作绝对时间,该点需要注意下。
该函数用于测量较短持续时间的具有最高有效精度的时钟,包括睡眠状态消耗的时间,使用两次调用才会有效。
测试代码如下:
t0=time.perf_counter() #运行一段代码 foriinrange(100000): pass print("程序运行时间",time.perf_counter()-t0)
与其类似的函数有perf_counter_ns()、process_time()、process_time_ns(),具体可以查询手册进行学习,先掌握perf_counter()函数即可。
时间组件
上文已经涉及了时间组件相关的知识,通过localtime得到的struct_time类型的数据。
这里涉及到的函数有gmtime()返回UTC中的当前时间,localtime()返回当前时区对应的时间,mktime()接收struce_time类型数据并将其转换成浮点型数值,即时间戳。
print("*"*10) print(time.gmtime()) print("*"*10) print(time.localtime()) print("*"*10) print(time.mktime(time.localtime()))
struct_time类型包含的内容
上述代码返回的数据格式为:
time.struct_time(tm_year=2021,tm_mon=3,tm_mday=9,tm_hour=12,tm_min=50,tm_sec=35,tm_wday=1,tm_yday=68,tm_isdst=0)
其中各值可以根据英文含义进行理解:tm_year年份(range[1,12]),tm_mon月份(range[1,12]),tm_mday天数(range[1,31]),tm_hour天数(range[0,23]),tm_min分钟(range[0,59]),tm_sec秒数(range[0,61]),tm_wday星期(range[0,6],0是星期日),tm_yday一年中的一天(range[1,366]),tm_isdst在夏令时生效时设置为1,而在夏令时不生效时设置为0,值-1表示这是未知的。
解析和格式化时间
strptime()和strftime()函数可以使时间值在struct_time表示和字符串表示之间相互转换。
对于strftime函数,其中的参数参考官方即可。
x=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime()) print(x)
strptime函数的应用
x=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime()) print(x) #方向操作,字符串格式化成time.struct_time struct_time=time.strptime(x,"%Y-%m-%d%H:%M:%S") print(struct_time)
需要记忆的就是strftime与strptime函数只有中间的字符不同,一个是f,另一个是p。
time小节
对于time模块,sleep函数属于必备知识点,但是太常用了,你肯定已经很熟悉了。
对于模块的学习,最权威的就是官方手册了,time模块
datetime模块
该模块比time模块高级了很多,并且对time模块进行了封装,提供的功能更加强大了。
在datetime模块中,Python提供了5个主要的对象类,分别如下:
- datetime:允许同时操作时间和日期;
- date:只操作日期;time:只操作时间;
- timedelta:用于操作日期以及测量时间跨度;
- tzinfo:处理时区。
date类
优先展示部分该类的属性和方法,都是记忆层面的知识。
- min、max:date对象能表示的最大、最小日期;
- resolution:date对象表示日期的最小单位,返回天;
- today():返回表示当前本地日期的date对象;
- fromtimestamp(timestamp):根据时间戳,返回一个date对象。
测试代码如下:
fromdatetimeimportdate importtime print('date.min:',date.min) print('date.max:',date.max) print('date.resolution:',date.resolution) print('date.today():',date.today()) print('date.fromtimestamp():',date.fromtimestamp(time.time()))
输出结果:
date.min:0001-01-01
date.max:9999-12-31
date.resolution:1day,0:00:00
date.today():2021-03-09
date.fromtimestamp():2021-03-09
date对象的属性和方法
通过下述代码创建一个date对象:
d=date(year=2021,month=3,day=9) print(d)
该对象具备下述属性和方法:
- d.year:返回年;
- d.month:返回月;
- d.day:返回日;
- d.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
- d.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
- d.isocalendar():返回格式如(year,wknum,wkday);
- d.isoformat():返回格式如'YYYY-MM-DD'的字符串;
- d.strftime(fmt):自定义格式化字符串,与time模块中的strftime类似。
time类
time类定义的类属性:
- min、max:time类所能表示的最小、最大时间。其中,time.min=time(0,0,0,0),time.max=time(23,59,59,999999);
- resolution:时间的最小单位,这里是1微秒;
通过其构造函数可以创建一个time对象。
t=time(hour=20,minute=20,second=40) print(t)
time类提供的实例方法和属性:
- t.hour、t.minute、t.second、t.microsecond:时、分、秒、微秒;
- t.tzinfo:时区信息;
- t.isoformat():返回型如”HH:MM:SS”格式的字符串时间表示;
- t.strftime(fmt):返回自定义格式化字符串。
datetime类
该类是date类与time类的结合体,很多属性和方法前文已经介绍,再补充一些比较常用的属性和方法。
获取当前的日期与时间:
fromdatetimeimportdatetime dt=datetime.now() print(dt)
获取时间戳:
dt=datetime.now() #使用datetime的内置函数timestamp() stamp=datetime.timestamp(dt) print(stamp)
timedelta类
通过timedelta函数返回一个timedelta时间间隔对象,该函数没有必填参数,如果写入一个整数就是间隔多少天的的意思。
#间隔10天 timedelta(10) #跨度为1周 timedelta(weeks=1)
两个时间间隔对象可以彼此之间相加或相减,返回的仍是一个时间间隔对象。
一个datetime对象如果减去一个时间间隔对象,那么返回的对应减去之后的datetime对象,然后两个datetime对象如果相减,返回的是一个时间间隔对象。
更多关于datetime类使用的知识,可以参考官方手册。
calendar模块(日历)
此模块的函数都是日历相关的,例如打印某月的字符月历。
calendar模块定义了Calendar类,它封装了值的计算,例如给定月份或年份中周的日期。通过TextCalendar和HTMLCalendar类可以生成预格式化的输出。
基本代码:
importcalendar c=calendar.TextCalendar(calendar.SUNDAY) c.prmonth(2021,3)
上述代码,默认是从周日开始的,输出结果:
March2021
SuMoTuWeThFrSa
123456
78910111213
14151617181920
21222324252627
28293031
该模块使用频率较低,详细使用参考地址进行学习。
总结
到此这篇关于Python玩转时间和日期库的实现的文章就介绍到这了,更多相关Python时间和日期库内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。