How to add delta to python datetime.time?
Question:
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'
Answers:
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.
datetime.time
objects do not support addition with datetime.timedelta
s.
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.
Here is a function that adds a timedelta
to a time
:
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()
This will provide the expected result so long as you don’t add times in a way that crosses a midnight boundary.
A datetime.time object can be split into separate integer components that you can add to.
No need for timedelta eg:
from datetime import datetime, time
time_now = datetime.now().time()
twelve_hours_time = time(time_now.hour + 12, time_now.minute)
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()
from datetime import datetime, date, timedelta, time
result = datetime.combine(date.today(), test_time) + timedelta(minutes=int(gap))
print(result.time())
Note:minutes should be int;
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'
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.
datetime.time
objects do not support addition with datetime.timedelta
s.
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.
Here is a function that adds a timedelta
to a time
:
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()
This will provide the expected result so long as you don’t add times in a way that crosses a midnight boundary.
A datetime.time object can be split into separate integer components that you can add to.
No need for timedelta eg:
from datetime import datetime, time
time_now = datetime.now().time()
twelve_hours_time = time(time_now.hour + 12, time_now.minute)
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()
from datetime import datetime, date, timedelta, time
result = datetime.combine(date.today(), test_time) + timedelta(minutes=int(gap))
print(result.time())
Note:minutes should be int;