如何将dateutil.relativedelta对象转换为datetime.timedelta对象?

时间:2015-01-01 06:30:36

标签: python datetime timedelta python-dateutil relative-date

如何将dateutil.relativedelta对象转换为datetime.timedelta对象?

如,

# pip install python-dateutil

from dateutil.relativedelta import relativedelta
from datetime import timedelta

rel_delta = relativedelta(months=-2)
# How can I convert rel_delta to a timedelta object so that I can call total_seconds() ?
time_delta = ???(rel_delta)  
time_delta.total_seconds()  # call the timedelta.total_seconds() method

3 个答案:

答案 0 :(得分:4)

你不能,因为一个巨大的原因:它们不存储相同的信息。 datetime.timedelta只存储天,秒和毫秒,而dateutil.relativedelta存储每个时间组件

dateutil.relativedelta这样做对于存储诸如1个月的差异很重要,但由于一个月的长度可以变化,这意味着在{{中根本没有办法表达同样的事情1}}。

答案 1 :(得分:1)

如果其他人需要解决方案,我通过在已知时间添加和减去将dateutil.relativedelta转换为datetime.timedelta。

utcnow = datetime.utcnow()
rel_delta = relativedelta(months=-2)
time_delta = utcnow + rel_delta - utcnow

答案 2 :(得分:0)

根据您要调用total_seconds的原因,可能会重构您的代码以完全避免转换。例如,考虑检查用户是否超过18岁:

datetime.date.today() - user['dateOfBirth'] < datetime.timedelta(days=365*18)

这个检查不是一个好主意,因为timedelta对象不会考虑像闰年这样的事情。重写为:

很有诱惑力
datetime.date.today() - user['dateOfBirth'] < dateutil.relativedelta.relativedelta(years=18)

这需要将timedelta(LHS)与relativedelta(RHS)进行比较,或将其转换为另一个。但是,您可以重构检查以完全避免这种转换:

user['dateOfBirth'] + dateutil.relativedelta.relativedelta(years=18) > datetime.date.today()