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

How to convert dateutil.relativedelta object to datetime.timedelta object?

如何将 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

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

dateutil.relativedelta 这样做对于存储诸如相差 1 个月之类的东西很重要,但是由于一个月的长度可能不同,这意味着根本无法用datetime.timedelta.

如果有人希望从特定日期将 relativedelta 转换为 timedelta 只需加减已知时间即可:

utcnow = datetime.utcnow()
rel_delta = relativedelta(months=-2)
time_delta = utcnow + rel_delta - utcnow  # e.g, datetime.timedelta(days=-62)

a commenter points out 一样,生成的 timedelta 值会因月份而异。

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

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

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

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

这将需要将时间增量 (LHS) 与相对增量 (RHS) 进行比较,或将两者相互转换。但是,您可以重构检查以完全避免这种转换:

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