Python-Zeit + Timedelta-Äquivalent

Antworten:

137

Die Lösung finden Sie in dem Link, den Sie in Ihrer Frage angegeben haben:

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

Vollständiges Beispiel:

from datetime import date, datetime, time, timedelta

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

Ausgabe:

00:25:00
jfs
quelle
4
Es fühlt sich ein bisschen wie eine Umgehung an, die Daten durch irrelevante Informationen zu verbessern. Was passiert, wenn today()der Tag vor der Umstellung auf Sommerzeit liegt und sich das Zeitdelta in die andere Zeitzone erstreckt? Ist dieser Code von Gebietsschemas betroffen?
bluenote10
1
@ bluenote10 Ein naives Datum / Uhrzeit-Objekt ist nur eine ganzzahlige Anzahl von Mikrosekunden, die nach dem proleptischen Gregorianischen Kalender aufgeschlüsselt ist. Mit anderen Worten, der Code in der Antwort funktioniert während der Sommerzeitübergänge in einer beliebigen lokalen Zeitzone unverändert. date.today()wird verwendet, um sowohl positive als auch negative Zeitpläne zu unterstützen. date.minwürde für positive Zeitpläne arbeiten.
JFS
@JFSebastian: Das ist beruhigend, danke für das Update. Es lässt mich immer noch zusammenzucken, wenn eine Funktion, die rein sein soll, eine Nebenwirkung hat. Leute aus dem Jahr 9999 werden das auch nicht mögen;).
bluenote10
3
@ bluenote10 Praktikabilität schlägt Reinheit. Ich bezweifle datetime.MAXYEAR, dass 9999 in 9999 bleiben wird.
jfs
10

Wenn es sich lohnt, Ihrem Projekt eine weitere Datei / Abhängigkeit hinzuzufügen, habe ich gerade eine kleine Klasse geschrieben, die sich datetime.timemit der Fähigkeit zum Rechnen erweitert. Wenn Sie nach Mitternacht gehen, dreht es sich nur um:

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

Es ist bei PyPi als nptime("nicht pedantische Zeit") oder auf GitHub erhältlich: https://github.com/tgs/nptime

Die Dokumentation finden Sie unter http://tgs.github.io/nptime/

residdsk
quelle
Großartig. Dies erspart die Hin- und Rückfahrt in die Welt von datetime und zurück.
Syncopated
6

Das ist ein bisschen böse, aber:

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
quelle
1
+1: für datetimeModul. Andernfalls müssten Überlauffehler und dergleichen manuell behandelt werden.
JFS
6

Problemumgehung:

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

Sie können die Mikrosekunden auch weglassen, wenn Sie nicht so viel Präzision benötigen.

etw
quelle
Ja, schöne Antwort. Ich hätte es schwieriger machen sollen, wie: Zeit () + Zeitdelta (Minuten = 30)
Antonius Common
s /. t.second /, t.second /
jfs
6
Wenn t == time(23,59)dann dieser Ansatz nicht funktioniert. Wenn Sie hinzufügen 1, erhalten t.hourSieValueError: hour must be in 0..23
jfs
Der Syntaxfehler wurde behoben. Für den Fall 23:59 ist die Frage, was die eigentliche Absicht der Berechnung ist, was Sie in diesem Fall wirklich als Ergebnis erhalten möchten. Ich ging davon aus, dass es am selben Tag bleiben sollte (oder einen Fehler geben sollte), sonst hätten Sie normalerweise an erster Stelle Datum / Uhrzeit ...
etw
1
Diese Methode hat einen Fehler für mich verursacht, da ich bis zum 31. Oktober 1 Tag hinzugefügt habe. Aus diesem Grund sollten Sie datetime.timedelta(days=1)einem Datum / Uhrzeit-Objekt einen Tag hinzufügen. Sie vermeiden Debug-Land.
Bobort
1

Sie können time () in now () ändern, damit es funktioniert

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
Yiming
quelle