Как да добавите делта към python datetime.time?

от:

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'

person xliiv    schedule 16.09.2012    source източник


Отговори (5)


datetime.time обекти не поддържат добавяне с datetime.timedeltas.

Има обаче едно естествено определение, аритметика на часовника. Можете да го изчислите така:

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 обект, делтата след това се добавя и резултатът се връща обратно към datetime.time обект.

person unutbu    schedule 16.09.2012
comment
Това е много работа. Искам само да изчисля смяна на времето, питон :). все пак е решение, благодаря. - person xliiv; 16.09.2012
comment
Едно нещо, което трябва да се отбележи тук е, че ако t е по-малко от delta, тогава ще получите dt.date(1,1,0), което е OverflowError: date value out of range . Един от начините да се подходи към това е да се увеличат стойностите в dt.date(...). Но това все още е проблем, с който трябва да се внимава. - person Akavall; 25.08.2015
comment
това е стара публикация, каква беше версията на Python тогава? Вероятно 2. Използвам Python 3 и имам същия проблем. Наистина разочароващият факт е, че го пробвах без цялото заобиколно решение на конзолата и работи перфектно, след това го сложих в моя код и той напълно се провали. Това наистина е много тъжно. Във всеки случай посоченото решение работи. - person DanDan; 22.11.2018

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

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

person ssword    schedule 23.02.2019
comment
вашият начин показва обект datetime.datetime. той има обект datetime.time - person jon rios; 25.05.2021
comment
Това дава различен резултат: datetime.datetime(2012, 9, 17, 6, 24, 9, 635862) вместо datetime.date(2012, 9, 16, 12) - person user2561747; 24.06.2021

Ето функция, която добавя 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()

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

person David Foster    schedule 04.08.2015

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

Тогава какво трябва да върне 18:00:00 + 8 hours?
Няма отговор на този въпрос и затова не можете да добавите време и времеделта.

С други думи:

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.
person Thomas Orozco    schedule 16.09.2012
comment
Докато общата ви точка е правилна, 18:00 + 5 часа = 23:00, така че това е лош пример и .time() не връща клеймо за време -- клеймото за време често включва достатъчно информация, за да извлече дата, а datetime.time обектът не го прави. - person agf; 16.09.2012
comment
@agf, да, всъщност редактирах поста си :). Също така ще променя използването на клеймо за време! - person Thomas Orozco; 16.09.2012
comment
Добре, разбирам обяснението, ще свикна с него. наречете ме глупав, но според моите разсъждения добавянето на часове към само дата би трябвало да доведе до изключение във всяко от двете:) обаче не е компактно в тази форма. Мисля, че добавянето на време към време в рамките на един ден (24 часа) може да е възможно. Как мога да постигна това в текущото състояние, като добавяне на 2h33m към сега()? - person xliiv; 16.09.2012
comment
Отговорът на @xliiv unubtu ще ви даде това :) - person Thomas Orozco; 16.09.2012

Обект datetime.time може да бъде разделен на отделни цялочислени компоненти, към които можете да добавите. Няма нужда от timedelta, напр.:

from datetime import datetime, time
    time_now = datetime.now().time()
    twelve_hours_time =  time(time_now.hour + 12, time_now.minute)
person Martin Jones    schedule 20.07.2018
comment
Това би рискувало да натиснете часовия компонент ›23 или минутата ›59 и тогава ще получите ValueError. Най-лесно е просто да използвате дата и час вместо време, когато правите добавяне. Имал съм случаи на употреба, при които току-що направих фиктивно datetime.datetime(1, 1, 1, hour, minute) да направя добавянето на timedelta и след това да преобразувам във време. - person Brian; 31.07.2018