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