время Python + эквивалент timedelta


80

Я пытаюсь сделать что-то вроде этого:

time() + timedelta(hours=1)

однако Python не позволяет этого , по-видимому, по уважительной причине.

У кого-нибудь есть простой обходной путь?

Связанный:

Ответы:


138

Решение находится по ссылке, которую вы указали в своем вопросе:

datetime.combine(date.today(), time()) + timedelta(hours=1)

Полный пример:

from datetime import date, datetime, time, timedelta

dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()

Вывод:

00:25:00

4
Это немного похоже на обходной путь для улучшения данных за счет нерелевантной информации. Что произойдет, если today()перед переходом на летнее время наступит день, а timedelta перейдет в другой часовой пояс? На этот код влияют локали?
bluenote10

1
@ bluenote10 наивный объект datetime - это просто целое число микросекунд, разбитых согласно пролептическому григорианскому календарю. Другими словами, код в ответе работает как есть во время перехода на летнее время в любом часовом поясе. date.today()используется для поддержки как положительных, так и отрицательных временных дельт. date.minбудет работать для положительных timedeltas.
jfs

@JFSebastian: Это обнадеживает, спасибо за обновление. Меня все еще раздражает, если функция, которая должна быть чистой, имеет побочный эффект. Людям из 9999 года это тоже не понравится;).
bluenote10

3
@ bluenote10 Практичность лучше чистоты. Сомневаюсь, datetime.MAXYEARчто 9999 останется в 9999.
jfs

10

Если в ваш проект стоит добавить еще один файл / зависимость, я только что написал крошечный класс, который расширяется datetime.timeза счет возможности выполнять арифметические операции. Если вы пройдете за полночь, он просто обернется вокруг:

>>> from nptime import nptime
>>> from datetime import timedelta
>>> afternoon = nptime(12, 24) + timedelta(days=1, minutes=36)
>>> afternoon
nptime(13, 0)
>>> str(afternoon)
'13:00:00'

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

Документация находится на http://tgs.github.io/nptime/


Отлично. Это избавляет от необходимости возвращаться в мир datetime и обратно.
Джошуа Чиа

6

Это немного неприятно, но:

from datetime import datetime, timedelta

now = datetime.now().time()
# Just use January the first, 2000
d1 = datetime(2000, 1, 1, now.hour, now.minute, now.second)
d2 = d1 + timedelta(hours=1, minutes=23)
print d2.time()

1
+1: для datetimeмодуля. В противном случае потребуется обрабатывать ошибки переполнения и тому подобное вручную.
jfs

6

Обходной путь:

t = time()
t2 = time(t.hour+1, t.minute, t.second, t.microsecond)

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


да, хороший ответ. Я должен был сделать это посложнее, например: time () + timedelta (minutes = 30)
Антониус Коммон

6
Если t == time(23,59)тогда этот подход не сработает. Когда вы добавите 1к, t.hourвы получитеValueError: hour must be in 0..23
jfs

Исправлена ​​синтаксическая ошибка. Для случая 23:59 вопрос состоит в том, какова реальная цель расчета, что вы действительно хотите получить в результате в этом случае. Я предположил, что он должен остаться в тот же день (или выдать ошибку), иначе у вас обычно будет в первую очередь datetime ...
sth

1
Этот метод вызвал у меня ошибку, потому что я добавлял 1 день к 31 октября. По этой причине вы должны использовать его datetime.timedelta(days=1)для добавления дня к объекту datetime. Вы избежите отладки.
Боборт

2

Вы можете изменить time () на now (), чтобы он работал

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.