本文作者:胡 婧
文字编辑:杨慧琳
技术总编:张学人
Python中用于处理日期和时间的模块包括time、datetime和calendar。在之前的推文中《Python之time模块详解》详细的介绍了time模块的相关内容,即主要处理的是时间类数据,例如时、分、秒等相关信息。今天小编将为大家介绍datetime模块的基本用法。datetime模块可处理时间、日期等数据,是date和time模块的集合,其总共定义6类:datetime.date、datetime.time、datetime.datetime、datetime.timedelta、datetime.tzinfo、datetime. timezone。tzinfo、timezone为时区类相关处理模块,本文不做过多讲解,而主要介绍前四类内容。
0. 前 言
在开始介绍datetime模块之前,先讲一下该模块下date、time以及datetime三个类的区别和联系。正如其表面意思一样,date是对日期进行处理,其最小的单位是天数;time是对时间进行处理,其最小的单位是微秒(一百万分之一秒);datetime则是上两个类的合集,其最小的单位是微秒,但是其必须包含日期的参数,可以省略时间的参数(省略的参数默认为0)。time不可以进行时间的加减运算,而datetime类和date类则可以结合timedelta进行时间以及日期的加减运算。当datetime省略时间的参数时,看起来和date表示出来的结果一致,实际上两者在时间加减运算时的精度不一致。具体区别,可以通过以下程序输出的结果进行比较:
import datetimea1=datetime.time(8,12,4,3)a2=datetime.time(8) #其他参数省略时默认为0a1>a2b=datetime.date(2019,6,10)print(b.toordinal())print(b.timetuple())c1=datetime.datetime(2019,6,10)c2=datetime.datetime.today()print(c1.toordinal(),c2.toordinal())print(c1.timetuple(),c2.timetuple()) #c1和c2的时间戳看起来一样,但是时间元组不同delta=datetime.timedelta(days=1,hours=2,minutes=3,seconds=4) newb=b+deltanewc=c1+deltaprint(newb,newc)
其中newb只比b增加了1天,因为date类时间的最小单位为天数,所以delta中的小时,分钟,秒钟在与date类时间相加时自动忽略掉。而newc则是比c1增加了一天零2小时3分4秒。
1. datetime.date
datetime.date用于对于日期的处理,其中有三个参数:year、month、day。其中想要获取当前日期,以及返回当前日期的年、月、日,程序如下所示:
import datetimea=datetime.date.today()print(a.year)print(a.month)print(a.day)
同时,我们还可以改变日期的格式,将其变成时间戳或是时间元组格式。程序如下:
a.toordinal() #变为时间戳a.timetuple() #变为时间元组a.timetuple().tm_year #返回其中的年份a.__str__() #简单的获得日期的字符串a.strftime("%Y%m%d") #将日期以指定的形式输出a.__format__('%Y-%m-%d')a.ctime()
这里可以注意到,当将其转换为时间元组时,会自动生成小时、分钟、秒钟的参数,并将其设置为0。同时,我们不仅可以将日期换成其他格式,也可以比较两个日期的大小以及算两个日期相隔多少天。在进行比较时,如果是真则返回“True”,如果是假则返回“Flase”。具体程序如下所示:
b=datetime.date(1997,3,18)aa>bc=a-bc.days
2. datetime.time
datetime.time用于对于时间的处理,其中有五个参数:hour、minute、second、microsecond(毫秒)以及tzinfo(时区),必须包含时间参数,其他可以省略,省略时视该参数的取值为0。
其基本用法与date的相关用法类似,具体用法如以下程序所示:
a=datetime.time(11,31,00,00)print(a.hour,a.minute,a.second,a.microsecond,a.tzinfo)a.__str__() #简单获取时间的字符串a.strftime("%H:%M:%S")a.__format__('%H-%M-%S')b=datetime.time(12,22,12,23)print(aprint(a>b)
这里的a和b不能转化为时间戳或是时间元组,因为其不包含日期参数。也不能计算a与b之间的时间间隔。
3. datetime.datetime
datetime模块中的datetime类可以看作是上两类的合集。datetime.datetime参数包括:year、month、day、hour、minute、second、microsecond、tzinfo(时区)。而在具体的使用过程中,必须要出现的参数为:year、month、day。其他参数如果不需要可以省略不写。程序如下:
from datetime import datetime as dta=dt.now() #本地当前时间b=dt(2018,5,26) #没写的参数默认为0min=dt.min #datetime模块中datetime类可表示的最小时间max=dt.max #datetime模块中datetime类可表示的最大时间print(min)print(max)b.toordinal() #变为时间戳b.timetuple() #变为时间元组print(a-b)
在datetime类进行日期的相减时,得到的是精确到秒的两者的时间差。datetime模块中的datetime类和time模块的参数看起来类似,datetime类中的时间也的确可以转换为time模块中的表示形式,即时间戳以及时间元组。而对于日期时间的比较和加减运算,只能通过datetime模块进行,time模块不支持日期时间之间的比较和加减运算。
表1 各参数的取值范围
参数 | 取值范围 |
year | 0001-9999 |
month | 1-12 |
day | 1-30(31)[2月则以其实际天数为准] |
hour | 0-24 |
minute | 0-60 |
second | 0-60 |
microsecond | 0-1000000 |
4. datetime. timedelta
如上图所示,datetime. timedelta表示的是两个date或者datetime的时间差。我们可以运用datetime. timedelta对时间进行相应的加减处理。例如,可以运算得出已知的日期加上300天的具体日期为多少。其参数为:days、seconds、microseconds、milliseconds、minutes、hours、weeks。其只能储存days、seconds、microseconds相关信息,其他信息则自动转换为这三个信息储存起来。具体用法如下所示:
a=dt.now() #本地当前时间print(a)delta=datetime.timedelta(days=1,hours=2,minutes=30,seconds=20)print(delta)newtime=a+delta #当前时间加上1一天2小时30分20秒的时间print(newtime)