Подтвердить что ты не робот

Как добавить delta в python datetime.time?

From:

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

Объект timedelta представляет собой продолжительность, разность между двумя даты или время.

Так почему я получаю ошибку с этим:

>>> from datetime import datetime, timedelta, time
>>> datetime.now() + timedelta(hours=12)
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862)
>>> datetime.now().date() + timedelta(hours=12)
datetime.date(2012, 9, 16)

>>> datetime.now().time() + timedelta(hours=12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
4b9b3361

Ответ 1

datetime.time объекты не поддерживают добавление с помощью datetime.timedelta s.

Существует одно естественное определение, хотя арифметика часов. Вы можете вычислить его так:

import datetime as dt
now = dt.datetime.now()
delta = dt.timedelta(hours = 12)
t = now.time()
print(t)
# 12:39:11.039864

print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time())
# 00:39:11.039864

dt.datetime.combine(...) возвращает datetime.time t в объект datetime.datetime, затем добавляется delta, и результат отбрасывается до объекта datetime.time.

Ответ 2

Как это работает? datetime.datetime.now().time() возвращает только часы, минуты, секунды и т.д., нет информации о дате, которую возвращает .time(), только время.

Затем, что должно 18:00:00 + 8 hours вернуть?
Там нет ответа на этот вопрос, и почему вы не можете добавить время и timedelta.

Другими словами:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it 2:28:44, Sep. 17, 2012
18:28:44 + 5 hours # Doesn't make sense.

Ответ 3

Вот функция, которая добавляет time к timedelta:

def time_plus(time, timedelta):
    start = datetime.datetime(
        2000, 1, 1,
        hour=time.hour, minute=time.minute, second=time.second)
    end = start + timedelta
    return end.time()

Это обеспечит ожидаемый результат, если вы не добавляете время таким образом, чтобы он пересекал границу полуночи.