如何将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
答案 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()