How to add delta to python datetime.time?

108,617

Solution 1

datetime.time objects do not support addition with datetime.timedeltas.

There is one natural definition though, clock arithmetic. You could compute it like this:

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(...) lifts the datetime.time t to a datetime.datetime object, the delta is then added, and the result is dropped back down to a datetime.time object.

Solution 2

All the solutions above are too complicated, OP had already shown that we can do calculation between datetime.datetime and datetime.timedelta, so why not just do:

(datetime.now() + timedelta(hours=12)).time()

Solution 3

How would this work? datetime.datetime.now().time() returns only hours, minutes, seconds and so on, there is no date information what .time() returns, only time.

Then, what should 18:00:00 + 8 hours return?
There's not answer to that question, and that's why you can't add a time and a timedelta.

In other words:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012
18:28:44 + 8 hours # Doesn't make sense.
Share:
108,617
xliiv
Author by

xliiv

Updated on July 14, 2021

Comments

  • xliiv
    xliiv almost 3 years

    From:

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

    A timedelta object represents a duration, the difference between two dates or times.

    So why i get error with this:

    >>> 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'