Python日期和时间没有原生数据类型来支持Python中的时间。日期和时间的操作需要借助三个模块,分别是time、datetime、calendar。时间模块可以运行C语言库中与时间相关的函数,可以获得时钟时间和处理器运行时间。datetime模块提供日期和时间的高级接口。calendar模块是一个通用的日历相关函数,用于创建周、月和年的重复事件。在学习之前,有一些术语需要补充,你可以把这些术语当做约定俗成。这里Python官方文档中也有相关说明,不过信息量很大,橡皮擦会摘录你必须知道的部分。epoch(纪元)是时间开始的点,其值取决于平台。对于Unix,纪元是1970年1月1日00:00:00(UTC)。要找出给定平台上的纪元,请使用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)epochseconds一词指的是从纪元(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:ReturnTrueorFalse.如果时钟可以自动更改(例如通过NTP守护程序)或由系统管理员手动更改,则为True,否则为False;implementation:用于获取时钟值的底层C函数名,调用底层C的那个;monotonic:如果时钟不能倒退则为真,否则为假;resolution:以秒为单位的时钟分辨率(浮点数)。importtimeavailable_clocks=[('clock',time.clock),('monotonic',time.monotonic),('perf_counter',time.perf_counter),('process_time',time.process_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()函数获取纪元秒,可以以浮点数形式返回纪元开始后的秒数。importtimeprint(time.time())#输出结果为1615257195.558105。时间戳广泛用于计算与时间相关的程序,必须掌握。获取一个可读的时间戳,主要是为了方便计算时间,一般人理解起来比较困难。如果要获取可读时间,使用ctime()函数获取即可。importtimeprint(time.ctime())#Outputcontent: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位操作系统上测试时,得到的数据如下:importtimelocaltime=time.localtime(0)print("Thetimeis:",localtime)#Thetimeis: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("Thetimeis:",localtime)#OSError:[Errno22]Invalidargumentprint(type(localtime))monotonictimemonotonictimemonotonictime从系统启动开始计时,从0开始单调递增.操作系统的时间不一定从0开始,时间不对会回调。该函数的原型如下,不需要任何参数,返回一个浮点数,表示单调时钟的小数秒值:time.monotonic()测试代码如下:print("monotonictime",time.monotonic())#output:Monotonictime12279.244处理器时钟时间time()函数返回纪元秒(时间戳),clock()函数返回处理器时钟时间。该函数的返回值:第一次调用时,返回程序实际运行时间;第二次调用时,返回从第一次调用到本次调用的时间间隔。需要注意的是,Python3.8移除了clock()函数,取而代之的是time.perf_counter()或time.process_time()方法。t0=time.clock()#运行一段代码print(time.clock()-t0,"programrunningtime")我用的是高版本的Python,异常如下:time.clockhasbeendeprecated在Python3.3中并将从Python3.8中删除:使用time.perf_counter或time.process_time代替t0=time.clock()time.perf\_counterperf_counter()函数的纪元未定义。该函数一般用于比较计算,而不是绝对时间,需要注意。此函数用于在短时间内测量具有最高可用精度的时钟,包括在睡眠状态下花费的时间,并且需要两次调用才能有效。测试代码如下:t0=time.perf_counter()#运行一段代码foriinrange(100000):passprint("Programrunningtime",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_hourdays(range[0,23]),tm_minminutes(range[0,59]),tm_secseconds(range[0,61]),tm_wdayweeks(range[0,6]],0是星期日),tm_yday一年中的第几天(range[1,366]),tm_isdst在DST生效时设置为1,在DST未生效时设置为0,值-1表示这是未知的。9.1.8解析和格式化时间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)#方向运行,将字符串格式化成时间。struct_timestruct_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提供了五个主要的对象类,分别是:datetime:允许同时操作时间和日期;日期:仅在日期运行;时间:只准时运作;timedelta:用于操作日期,测量时间跨度;tzinfo:处理时区。date类优先显示该类的一些属性和方法,这些是内存层面的知识。min、max:日期对象可以表示的最大和最小日期;resolution:日期对象表示日期的最小单位,返回天;today():返回代表当前本地日期的日期对象;fromtimestamp(timestamp):根据时间戳返回一个日期对象。测试代码如下:fromdatetimeimportdateimporttimeprint('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-01date.max:9999-12-31date.resolution:1day,0:00:00date.today():2021-03-09date.fromtimestamp():2021-03-09date对象属性和方法通过创建日期对象以下代码:d=date(year=2021,month=3,day=9)print(d)此对象具有以下属性和方法:d.year:返回年份;d.month:返回月份;d.day:返回星期几;d.weekday():返回工作日,如果是星期一,返回0;如果是第2周,则返回1,依此类推;d.isoweekday():返回工作日,如果是星期一则返回1;如果是第2周,则返回2,依此类推;d.isocalendar():返回格式如(year,wknum,wkday);d.isoformat():返回一个字符串,如'YYYY-MM-DD';d.strftime(fmt):自定义格式字符串,类似于时间模块中的strftime。时间类时间类定义的类属性:min、max:时间类可以表示的最小和最大时间。其中,time.min=time(0,0,0,0),time.max=time(23,59,59,999999);resolution:时间的最小单位,这里是1微秒;通过它的构造函数创建一个时间对象。t=time(hour=20,minute=20,second=40)print(t)时间类提供的实例方法和属性:t.hour,t.minute,t.second,t.microsecond:小时,分钟,第二,微秒;t.tzinfo:时区信息;t.isoformat():返回格式为“HH:MM:SS”的字符串时间表示;t.strftime(fmt):返回自定义格式的字符串。日期时间类该类是日期类和时间类的组合。上面介绍了很多属性和方法,再补充一些比较常用的属性和方法。获取当前日期时间:fromdatetimeimportdatetimedt=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类的使用知识,请参考【官方手册】。日历模块(calendar)该模块的功能是和日历相关的,比如打印某月的字符日历。calendar模块定义了Calendar类,它封装了值的计算,例如给定月份或年份的星期几。可以通过TextCalendar和HTMLCalendar类生成预格式化的输出。基本代码:importcalendarc=calendar.TextCalendar(calendar.SUNDAY)c.prmonth(2021,3)以上代码默认从周日开始,输出结果为:March2021SuMoTuWeThFrSa12345678910111213141516171819202122232425262728293031该模块使用频率较低,详细使用请参考地址。本博客总结本博客为大家补充了时间日期库的相关知识,希望能进入大家的收藏。