час python + еквівалент timedelta


Відповіді:


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()за день до переходу на літній час перейти на літній час, а часовий пояс переходить у інший часовий пояс? Чи впливає на цей код локалі?
bluenote10,

1
@ bluenote10 наївний об'єкт дати і часу - це просто ціле число мікросекунд, яке розбивається відповідно до пролептичного григоріанського календаря. Іншими словами, код у відповіді працює рівномірно, під час переходів на літній час у будь-якому місцевому часовому поясі. date.today()використовується для підтримки як позитивних, так і негативних термінів. date.minбуде працювати на позитивні терміни.
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/


Чудово. Це економить туди-сюди поїздку у світовий час і назад.
Джошуа Чіа

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)
Antonius Common

6
Якщо t == time(23,59)тоді такий підхід не спрацює. При додаванні 1до t.hourви отримаєтеValueError: hour must be in 0..23
JFS

Виправлено синтаксичну помилку. Для справи 23:59 питання полягає в тому, який справжній намір розрахунку, що ви насправді хочете отримати в результаті в такому випадку. Я припустив, що він повинен залишитися в той же день (або дати помилку), інакше спочатку у вас зазвичай буде дата і час ...
sth

1
Цей метод спричинив помилку для мене, оскільки я додавав 1 день до 31 жовтня. Саме з цієї причини вам слід datetime.timedelta(days=1)додати день до об’єкту datetime. Ви уникнете землі налагодження.
Bobort

2

Ви можете змінити час () на зараз (), щоб він працював

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.