2015-01-01 14 views
0

Как преобразовать объект dateutil.relativedelta в объект datetime.timedelta?Как преобразовать 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

Вы не можете, один огромный причине: Они не хранят ту же информацию.datetime.timedelta хранит только дни, секунды и миллисекунды, тогда как dateutil.relativedelta магазины каждый раз компонент подан к нему.

Это dateutil.relativedelta действительно так важно для хранения таких вещей, как разница в 1 месяц, но так как длина месяца может варьироваться, это означает, что вообще нет способа выразить одно и то же в datetime.timedelta.

+0

Thanks @ Ignacio_Vazquez-Abrams! Теперь я получаю это - объект relativedata хранит данные, которые используются при выполнении арифметики с объектом datetime, поэтому он должен иметь те же типы данных, что и объект datetime. –

1

В случае, если кому-то еще нужно решение, я преобразовал dateutil.relativedelta в datetime.timedelta путем добавления и вычитания из известного времени.

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

Это не определено. Замените 'datetime.utcnow()' на 'datetime (2000, 1, 1)', 'datetime (2000, 2, 1)' и 'datetime (2000, 3, 1)' соответственно, и вы получите три разных ответа , –

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 (РИТ), или преобразование одного к другому. Тем не менее, вы можете реорганизовать чек, чтобы избежать этого преобразования в целом:

user['dateOfBirth'] + dateutil.relativedelta.relativedelta(years=18) > datetime.date.today() 
Смежные вопросы