2

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

3 回答 3

6

你不能,有一个很大的原因:它们不存储相同的信息。 datetime.timedelta仅存储天、秒和毫秒,而dateutil.relativedelta存储馈送给它的每个时间组件。

这样dateutil.relativedelta做对于存储诸如 1 个月的差异之类的内容很重要,但由于一个月的长度可能会有所不同,这意味着根本无法在datetime.timedelta.

于 2015-01-01T06:39:29.793 回答
4

如果有人希望将relativedeltaatimedelta 从特定日期转换为 a,只需添加和减去已知时间:

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

正如评论者指出的那样,结果timedelta值会根据月份的不同而有所不同。

于 2015-12-09T19:44:44.177 回答
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()
于 2018-02-28T03:38:10.727 回答