Den*_*aia 73 python datetime timedelta
datetime.timedelta(来自Python的标准库)和dateutil.relativedelta.relativedelta仅使用几天时有什么区别?
据我了解,timedelta只支持天(和周),同时relativedelta增加了对按年,月,周或日定义的时段的支持,以及定义年,月或日的绝对值.(记住,出于这个问题的目的,我不必担心小时,分钟或秒)
考虑到我只能用工作datetime.date对象,只有在按天数来定义时间段感兴趣,有什么之间的区别timedelta和relativedelta?有什么区别吗?
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta
i = -1 # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)
Run Code Online (Sandbox Code Playgroud)
Han*_*hen 64
dateutil是python标准datetime模块的扩展包.正如您所说,它提供了额外的功能,例如以大于一天的单位表示的timedeltas.
如果您必须提出问题,例如在我女朋友的生日到来之前我可以节省多少个月,或者该月的最后一个星期五是什么?这隐藏了由月份的不同长度或闰年的额外天数引起的复杂计算.
在您的情况下,您只对天数感兴趣.因此,您最好使用,timedelta因为这可以避免对dateutil包的额外依赖.
unu*_*tbu 26
A relativedelta有比参数更多的参数timedelta:
Run Code Online (Sandbox Code Playgroud)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)
你可以用它来计算一个月的最后一个星期五:
In [14]: import datetime as dt
In [15]: import dateutil.relativedelta as relativedelta
In [16]: today = dt.date.today()
In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1))
In [18]: today+rd
Out[18]: datetime.date(2012, 9, 28)
Run Code Online (Sandbox Code Playgroud)
在其他答案中未突出显示的一个主要区别是,每个时差基元都存在单数和复数名词。虽然timedelta只提供复数名词(例如hours,days)来表示相对时间差,relativedelta报价单数名词以及(例如hour,day)来表示的绝对时间信息。
从这两个类的定义中可以清楚地看出:
Run Code Online (Sandbox Code Playgroud)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。这是一个小例子:
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)
Run Code Online (Sandbox Code Playgroud)
这可能会导致将relativedelta其用于某些有趣的应用程序,使用可能会使其实现复杂timedelta。很快想到的是四舍五入。
现在,我将向您展示relativedelta在将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) #Simply add one hour
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am
datetime.datetime(2018, 11, 17, 1, 6, 31)
Run Code Online (Sandbox Code Playgroud)
使用可以轻松实现其他更复杂的舍入relativedelta。但是,请注意,所有可以进行的四舍五入relativedelta也可以使用datetime函数和来完成timedelta,仅以稍微复杂的方式进行。