首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"datetime.timedelta“和"dateutil.relativedelta.relativedelta”之间的区别是什么?

"datetime.timedelta“和"dateutil.relativedelta.relativedelta”之间的区别是什么?
EN

Stack Overflow用户
提问于 2012-09-14 23:29:11
回答 4查看 123.4K关注 0票数 128

datetime.timedelta (来自Python的标准库)和dateutil.relativedelta.relativedelta之间的区别是什么?

据我所知,timedelta只支持天数(和周),而relativedelta则增加了对按年、月、周或天定义的期间的支持,以及定义年份、月或日的绝对值。(请记住,就这个问题而言,我不必担心时间、分钟或秒)

考虑到我只处理datetime.date对象,只对由天数定义的时间段感兴趣,那么timedeltarelativedelta之间有什么区别呢?有什么不同吗?

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-14 23:44:26

dateutil是python标准datetime模块的扩展包。正如您所说的,它提供了额外的功能,例如以大于一天的单位表示的timedelta。

如果你要问一些问题,比如在我女朋友生日到来之前我可以省几个月,或者这个月的最后一个星期五是什么,这是有用的。这隐藏了由月的不同长度或闰年的额外天数引起的复杂计算。

在你的例子中,你只对天数感兴趣。所以最好使用timedelta,因为这样可以避免对dateutil包的额外依赖。

票数 104
EN

Stack Overflow用户

发布于 2012-09-14 23:47:29

一个relativedelta比一个timedelta有更多的参数

定义:relativedelta.relativedelta(自我,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,day=None,)

你可以用它来计算一个月中的最后一个星期五:

代码语言:javascript
复制
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)
票数 54
EN

Stack Overflow用户

发布于 2018-11-17 01:13:11

在其他答案中没有突出显示的一个主要区别是,每个时差原语都存在单数和复数名词。timedelta只提供复数名词(如hoursdays)来表示相对时差,relativedelta也提供单数名词(例如hourday)来表示绝对时间信息。

从这两个类的定义中可以清楚地看出这一点:

定义:datetime.timedelta([天[,秒[,微秒[,毫秒[,分钟[,小时,周]])定义:relativedelta.relativedelta(自我,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,month=None,)

那么,奇异形式到底是做什么的呢?单数表单创建一个增量,当添加到datetime对象时,将datetime对象中的特定日期/时间基元设置为relativedelta中提到的日期/时间基元。下面是一个小例子:

代码语言:javascript
复制
>>> 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)

这可能导致relativedelta被用于一些有趣的应用程序,使用timedelta实现这些应用程序可能很复杂。一个迅速浮现在脑海中的是舍入。

有趣的应用程序:快速舍入

现在,我将向您展示relativedelta在将datetime对象舍入到最近的分钟、小时、日等时间时如何表现得更有表现力。

四舍五入到最近的时间:

请注意,使用relativedelta进行舍入是多么的简单。

代码语言:javascript
复制
#Using `relativedelta`
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)

#Using `timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)

其他更复杂的舍入可以很容易地使用relativedelta实现。但是,请注意,relativedelta可以完成的所有舍入操作也可以使用datetime函数和timedelta来完成,只是以一种稍微复杂一些的方式。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12433233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档