Каков стандартный способ добавить N секунд для datetime.time в Python?

Учитываяdatetime.time значение в Python, есть стандартный способ добавить к нему целое число секунд, так что11:34:59 + 3 = 11:35:02, например?

Эти очевидные идеи не работают:

<code>>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
</code>

В конце я написал такие функции:

<code>def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
</code>

Я не могу не думать, что мне не хватает более простого способа сделать это.

Related python time + timedelta equivalent
 jfs29 дек. 2014 г., 02:21
связанная проблема Python:datetime.time support for '+' and '-'

Ответы на вопрос(8)

Одна маленькая вещь, может добавить ясности, чтобы переопределить значение по умолчанию на секунды

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
 03 июл. 2014 г., 15:19
Мне нравится этот. Красиво и понятно с указанным аргументом.

Для полноты информации ради, вот способ сделать это сarrow (лучше даты и время для Python):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

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

Естьtimedelta класс для манипуляций с датой и временем.datetime минусdatetime даетtimedelta, datetime плюсtimedelta даетdatetime, дваdatetime объекты не могут быть добавлены, хотя дваtimedelta Можно.

Создайтеtimedelta Объект, сколько секунд вы хотите добавить и добавить его вdatetime объект:

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

В C ++ есть такая же концепция:std::chrono::duration.

 18 янв. 2018 г., 10:10
пожалуйста, ВСЕГДА добавляйте объяснения, новички могут не иметь ни малейшего понятия, что вы делаете здесь.

Если стоит добавить другой файл / зависимость в ваш проект, я только что написал крошечный маленький класс, который расширяетdatetime.time с умением делать арифметику. Когда вы выходите после полуночи, оно оборачивается вокруг нуля. Теперь, "Сколько времени это будет, через 24 часа" имеет много угловых случаев, в том числе летнее время, високосные секунды, исторические изменения часового пояса и так далее. Но иногда вам действительно нужен простой случай, и это то, что это будет делать.

Ваш пример будет написан:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime наследует отdatetime.timeпоэтому любой из этих методов тоже должен быть применим.

Он доступен от PyPi какnptime («Непедантичное время») или на GitHub:https://github.com/tgs/nptime

Спасибо @Pax Diablo, @bvmou и @Arachnid за предложение использовать полные даты и времени. Если мне придется принимать объекты datetime.time из внешнего источника, то это, кажется, альтернативаadd_secs_to_time() функция:

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

Этот подробный код может быть сжат до одной строки:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

но я думаю, что в любом случае я хочу обернуть это в функцию для ясности кода.

 25 мар. 2018 г., 08:33
Спасибо - отличная идея
Решение Вопроса

Вы можете использовать полныйdatetime переменные сtimedeltaи, предоставив фиктивную дату, затем с помощьюtime просто получить значение времени.

Например:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()

результаты в двух значениях с интервалом в три секунды:

11:34:59
11:35:02

Вы также можете выбрать более читабельный

b = a + datetime.timedelta(seconds=3)

если вы так склонны.

Если вы после функции, которая может сделать это, вы можете изучить использованиеaddSecs ниже:

import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b

Это выводит:

 09:11:55.775695
 09:16:55
 15 янв. 2013 г., 02:20
@pheelicks, сделано, хотя и немного поздно, не совсем быстрое время отклика :-) Так как мне пришлось исправить еще одну ошибку в моем коде, я подумал, что я включу ваше предложение в то же время.
 29 нояб. 2011 г., 06:23
Чтобы избежать ошибок переполнения, я рекомендую использовать другую фиктивную дату, например пару лет спустя: datetime (101,1,1,11,34,59). Если вы попытаетесь вычесть большую временную дельту из указанной выше даты, вы получите «OverflowError: значение даты вне диапазона» & quot; ошибка, поскольку год для объекта datetime не может быть меньше 1

Как уже говорили другие, вы можете просто использовать полные объекты datetime:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

Однако я думаю, что стоит объяснить, почему требуются полные объекты даты и времени. Посмотрим, что произойдет, если я добавлю 2 часа до 11 вечера. Какое поведение правильное? Исключение, потому что вы не можете иметь время больше 23:59? Должен ли он обернуться?

Разные программисты будут ожидать разных вещей, поэтому любой результат, который они выберут, удивит многих. Хуже всего то, что программисты писали код, который отлично работал, когда они сначала тестировали его, а затем ломали его позже, делая что-то неожиданное. Это очень плохо, поэтому вы не можете добавлять объекты timedelta к объектам времени.

Попробуйте добавитьdatetime.datetime кdatetime.timedelta, Если вы хотите только часть времени, вы можете позвонитьtime() метод на результатdatetime.datetime возражать, чтобы получить его.

Ваш ответ на вопрос