今天是Python时间模块的核心使用逻辑。这篇文章的思维导图如下:Python内置了一个时间模块datetime,它为我们提供了一个关于时间的表达方式。记录时间无处不在,日志文件、程序运行开始时间和持续时间、特征销售预测等等,我们都可以看到时间。本主题总结了datetime模块的主要用法。希望通过本文,大家在使用常用API进行时间处理的时候,不用借助帮助功能,不用搜索,也能轻松上手。1、核心逻辑datetime模块提供按日期时间分类的对象,日期处理相关对象date,时间处理相关对象date,以及日期时间的完整组合对象datetime。日期和时间的加减得到timedelta对象。此时此刻2020-8-2821:45,这个时间是当地时间。显然,纽约时间肯定不是这个值,柏林时间也肯定不是这个值。Python为了支持不同地区时间的表达,特意抽象了tzinfo对象,并有一个默认的实现对象。以上就是datetime模块的几个核心对象及其对应的实际意义。2.date、time和datetime对象下面介绍这三个最基本的对象的最基本用法。首先从datetime模块导入3个对象In[1]:fromdatetimeimportdate,time,datetime构造一个date日期实例,2020年9月1日:In[2]:date(2020,9,1)Out[2]:datetime.date(2020,9,1)构造一个时间实例,10:10:00:In[3]:time(10,10,0)Out[3]:datetime.time(10,10)构造一个完整的datetime日期+时间的实例,2020年9月1日10:10:00:In[4]:datetime(2020,9,1,10,10,10)Out[4]:datetime.datetime(2020,September,1,10,10,10)自己构造时间是没有意义的。打印当前时间更有意义。比如当程序开始打印时间的时候,如果程序可能会运行十几天,那么显然要使用date+time一个完整的datetime实例。该方法属于datetime类上的方法,所以不需要构造datetime实例,直接如下:datetime.today()#datetime类的today方法Out[5]:datetime.datetime(2020,8,28,22,0,47,439509)打印结果显示年、月、日、时、分、秒、毫秒。也可以使用now类的方法:In[6]:datetime.now()Out[6]:datetime.datetime(2020,8,28,22,1,28,737166)直接打印当前时间并返回stringresultofdate+time:In[7]:print(datetime.now())2020-08-2822:02:57.217572如果我们不想显示毫秒,这就涉及到date+Time打印格式问题。使用datetime类方法strftime(stringformattime),用法如下:In[8]:datetime.strftime(datetime.now(),'%Y-%m-%d%H:%M:%S')Out[8]:'2020-08-2822:06:20'这个涉及到打印格式化字符,常用的有一些:如果读入一个时间列,此时类型为str,为了对此进行时间计算,需要使用将其转换为datetime,使用strptime(stringparsetime),它是datetime的一个类方法:In[11]:datetime.strptime('2020-08-2822:06:20','%Y-%m-%d%H:%M:%S')Out[11]:datetime.datetime(2020,8,28,22,6,20)为了正确转换字符date+time转化为datetime对象,字符串和格式必须匹配,否则会报错:In[13]:datetime.strptime('2020-08-2822:06:20',\'%Y/%m/%d%H:%M:%S')ValueError:timedata'2020-08-2822:06:20'不匹配格式'%Y/%m/%d%H:%M:%S'3.基本操作有时需要偏离某个时间的时间,timedelta对象可以满足这个需求d.例如,查找当前时间前12个小时的日期+时间。首先导入timedelta类:in[15]:fromdatetimeimporttimedelta直接使用当前时间减去timedelta表示的12小时长度。注意第一个参数的意思是天,所以除以24:In[16]:datetime.now()-timedelta(12/24)Out[16]:datetime.datetime(2020,8,28,10,22,44,287246)从上面的用法可以总结为:datetime1-timedelta1=datetime2所以datetime1-datetime2=timedelta1,所以减去两次得到一个timedelta类型的实例。另外,还有一个可能用到的小方法,就是datetime类上的combine方法,可以将date实例和time实例组合成datetime实例,如下所示:In[17]:datetime.combine(date(2020,9,1),time(10,10,0))Out[17]:datetime.datetime(2020,9,1,10,10)4关于tzinfo为了更好的统一全球时间,世界规定UTC时间是全球统一时间。例如,假设北京时间比它早8小时,曼谷时间比它早7小时。比如在打印当前时间的时候,```pythonIn[6]:print(datetime.now())2020-08-2822:33:35.393709上面显示的时间其实是不完整的。我当然明白是我所在的时间,但是其他国家的开发者看到这个时间,可能会认为是UTC标准下的时间。如果这样解释,显然会和现实存在时差问题。有的读者会说,打印格式化的时候可以加上时区信息吗,我们来实验一下:In[19]:datetime.strftime(datetime.now(),\'%Y-%m-%d%H:%M:%S%Z')Out[19]:'2020-08-2822:39:44'时区信息为空,无法解决问题。时区信息会为空的原因是因为datetime.now()时没有给出tzinfo值。因此,我们需要自己重新定义一个tzinfo,即实现一个tzinfo对象。该类BJinfo继承了tzinfo,然后实现了三个方法:fromdatetimeimporttzinfoclassBJinfo(tzinfo):"""BJinfo"""defutcoffset(self,dt):returntimedelta(hours=8)deftzname(self,dt):return"UTC8"defdst(self,dt):returntimedelta(hours=8)此时打印当前时间时,给tzinfo赋值:nowt=datetime.now(tz=BJinfo())In[32]:In[6]:print(nowt)2020-08-2822:52:20.328446+08:00重新格式化并打印时区信息:...:'%Y-%m-%d%H:%M:%S%Z')36]:'2020-08-2822:52:20UTC8'通过时区信息BJinfo定义的三个方法可以确认时间2020-08-2822:52:20比UTC提前8小时,对应一个时间.小结以上是本题中datetime模块核心对象的使用小结。大纲如下:核心逻辑date,time和datetime对象基本操作关于tzinfo
