Учитывая datetime.time
значение в Python, есть ли стандартный способ добавить к нему целое число секунд, так что , например , 11:34:59
+ 3 = 11:35:02
?
Эти очевидные идеи не работают:
>>> 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'
В конце я написал такие функции:
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)
Я не могу не думать, что мне не хватает более простого способа сделать это, хотя.
Ответы:
Вы можете использовать полные
datetime
переменные сtimedelta
и, указав фиктивную дату, а затемtime
просто получить значение времени.Например:
результаты в двух значениях с интервалом в три секунды:
Вы также можете выбрать более читабельный
если вы так склонны.
Если вам нужна функция, которая может сделать это, вы можете посмотреть
addSecs
ниже:Это выводит:
источник
Как уже говорили другие, вы можете просто использовать полные объекты datetime:
Тем не менее, я думаю, что стоит объяснить, почему требуются полные объекты даты и времени. Посмотрим, что произойдет, если я добавлю 2 часа до 11 вечера. Какое правильное поведение? Исключение, потому что вы не можете иметь время больше, чем 23:59 вечера? Должен ли он обернуться?
Разные программисты будут ожидать разных вещей, поэтому любой результат, который они выберут, удивит многих. Хуже всего то, что программисты писали код, который отлично работал, когда они сначала тестировали его, а затем ломали его позже, делая что-то неожиданное. Это очень плохо, поэтому вы не можете добавлять объекты timedelta к объектам времени.
источник
Одна маленькая вещь, может добавить ясности, чтобы переопределить значение по умолчанию на секунды
источник
Спасибо @Pax Diablo, @bvmou и @Arachnid за предложение использовать полные даты и времени. Если мне нужно принять объекты datetime.time из внешнего источника, то это, кажется, альтернативная
add_secs_to_time()
функция:Этот подробный код может быть сжат до этой строки:
но я думаю, я бы хотел обернуть это в функцию для ясности кода в любом случае.
источник
Если стоит добавить еще один файл / зависимость в ваш проект, я только что написал крошечный маленький класс, который расширяет
datetime.time
возможности арифметики. Когда вы выходите после полуночи, оно оборачивается вокруг нуля. Теперь «Сколько времени будет через 24 часа» имеет множество угловых случаев, включая переход на летнее время, дополнительные секунды, исторические изменения часового пояса и т. Д. Но иногда вам действительно нужен простой случай, и вот что это будет делать.Ваш пример будет написан:
nptime
наследуется отdatetime.time
, поэтому любой из этих методов также должен быть пригоден для использования.Он доступен из PyPi как
nptime
(« непедантичное время») или на GitHub: https://github.com/tgs/nptimeисточник
Вы не можете просто добавить число,
datetime
потому что неясно, какая единица измерения используется: секунды, часы, недели ...Есть
timedelta
класс для манипуляций с датой и временем.datetime
минусdatetime
даетtimedelta
,datetime
плюсtimedelta
даетdatetime
, дваdatetime
объекта не могут быть добавлены, хотя дваtimedelta
могут.Создайте
timedelta
объект за сколько секунд вы хотите добавить и добавить его вdatetime
объект:Существует так же понятие в C ++:
std::chrono::duration
.источник
Для полноты, вот способ сделать это
arrow
(лучше даты и время для Python):источник
Попробуйте добавить
datetime.datetime
кdatetime.timedelta
. Если вам нужна только часть времени, вы можете вызватьtime()
метод для результирующегоdatetime.datetime
объекта, чтобы получить его.источник
Старый вопрос, но я решил добавить функцию, которая обрабатывает часовые пояса. Ключевые части передают атрибут
datetime.time
объектаtzinfo
в комбинат, а затем используютtimetz()
вместоtime()
него фиктивную дату-время. Этот ответ частично вдохновлен другими ответами здесь.И вот действительно простой класс тестового примера (с использованием встроенного
unittest
):источник