czas w Pythonie + odpowiednik timedelta

Odpowiedzi:

138

Rozwiązanie znajduje się w linku, który podałeś w swoim pytaniu:

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

Pełny przykład:

from datetime import date, datetime, time, timedelta

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

Wynik:

00:25:00
jfs
źródło
4
To trochę jak obejście polegające na wzbogaceniu danych o nieistotne informacje. Co się stanie, jeśli today()minie dzień przed przełączeniem na czas letni, a okres czasu rozciąga się na inną strefę czasową? Czy na ten kod mają wpływ ustawienia regionalne?
bluenote10
1
@ bluenote10 naiwny obiekt datetime to po prostu całkowita liczba mikrosekund, która jest podzielona zgodnie z proleptycznym kalendarzem gregoriańskim. Innymi słowy, kod w odpowiedzi działa tak samo, jak w pobliżu, podczas przejścia na czas letni w dowolnej lokalnej strefie czasowej. date.today()służy do wspierania zarówno pozytywnych, jak i negatywnych strategii czasowych. date.mindziałałyby na pozytywne czasy.
jfs
@JFSebastian: To uspokajające, dzięki za aktualizację. Nadal wzdrygam się, gdy funkcja, która ma być czysta, ma efekt uboczny. Ludziom z 9999 też się to nie spodoba;).
bluenote10
3
@ bluenote10 Praktyczność przewyższa czystość. Wątpię, datetime.MAXYEARże pozostanie 9999 w 9999.
jfs
10

Jeśli warto dodać kolejny plik / zależność do swojego projektu, właśnie napisałem małą małą klasę, która rozszerza się datetime.timeo możliwość wykonywania arytmetyki. Jeśli miniesz północ, po prostu się zawija:

>>> 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'

Jest dostępny w PyPi jako nptime(„czas niepedantyczny ”) lub na GitHub: https://github.com/tgs/nptime

Dokumentacja jest dostępna pod adresem http://tgs.github.io/nptime/

rescdsk
źródło
Świetny. To oszczędza podróży w obie strony do świata datetime iz powrotem.
Joshua Chia
6

To trochę paskudne, ale:

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()
Ali Afshar
źródło
1
+1: dla datetimemodułu. W przeciwnym razie wymagałoby ręcznej obsługi błędów przepełnienia.
jfs
6

Obejście:

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

Możesz także pominąć mikrosekundy, jeśli nie potrzebujesz tak dużej precyzji.

sth
źródło
tak, ładna odpowiedź. Powinienem był to skomplikować, na przykład: time () + timedelta (minuty = 30)
Antonius Common
6
Jeśli t == time(23,59)wtedy to podejście nie zadziała. Kiedy dodasz 1do t.hour, otrzymaszValueError: hour must be in 0..23
jfs
Poprawiono błąd składni. W przypadku 23:59 pytanie brzmi, jaki jest prawdziwy zamiar obliczenia, co tak naprawdę chcesz uzyskać w wyniku w takim przypadku. Założyłem, że powinien pozostać tego samego dnia (lub podać błąd), w przeciwnym razie zwykle na pierwszym miejscu
byłbyś
1
Ta metoda spowodowała u mnie błąd, ponieważ dodawałem 1 dzień do 31 października. Z tego powodu powinieneś użyć, datetime.timedelta(days=1)aby dodać dzień do obiektu datetime. Unikniesz debugowania ziemi.
Bobort
2

Możesz zmienić czas () na teraz (), aby działał

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
yiming
źródło