在其他答案中未突出显示的一个主要区别是,每个时差基元都存在单数和复数名词。虽然timedelta
只提供复数名词(例如hours
,days
)来表示相对时间差,relativedelta
报价单数名词以及(例如hour
,day
)来表示的绝对时间信息。
从这两个类的定义中可以清楚地看出:
Definition: datetime.timedelta([days[, seconds[, microseconds[,
milliseconds[, minutes[, hours[, weeks]]]]]]])
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)
现在,单数形式到底是做什么的?单数形式会创建一个增量,将其添加到datetime
对象后会将对象中的特定日期/时间原语设置datetime
为中提到的原语relativedelta
。这是一个小例子:
>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
这可能会导致将relativedelta
其用于某些有趣的应用程序,而使用它们可能会导致实现起来很复杂timedelta
。很快想到的是四舍五入。
一个有趣的应用程序:快速舍入
现在,我将向您展示relativedelta
在将datetime
对象四舍五入到最接近的分钟,小时,天等时如何更具表现力。
四舍五入到最接近的小时数:
请注意,使用进行四舍五入是多么简单relativedelta
:
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)
使用可以轻松实现其他更复杂的舍入relativedelta
。但是,请注意,所有可以进行的四舍五入relativedelta
也可以使用datetime
函数和来完成timedelta
,只是要稍微复杂一些。
dateime.timedelta
实现所需的功能,并避免依赖于外部dateutil
程序包。