Was ist der normale Weg, N Sekunden datetime.time in Python hinzufügen?
Frage
ein datetime.time
Wert in Python gegeben, ist es eine Standardmethode eine ganze Anzahl von Sekunden, um es hinzuzufügen, so dass 11:34:59
+ 3 = 11:35:02
zum Beispiel?
Diese offensichtlichen Ideen nicht funktionieren:
>>> 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'
Am Ende habe ich Funktionen geschrieben wie folgt:
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)
Ich kann nicht umhin zu denken, dass ich einen einfacheren Weg bin fehle dies aber zu tun.
Related
Lösung
Sie voll datetime
Variablen mit timedelta
verwenden kann, und durch ein Dummy-Datum Bereitstellung dann time
mit nur den Zeitwert erhalten.
Zum Beispiel:
import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()
Ergebnisse in den beiden Werten, 3 Sekunden auseinander:
11:34:59
11:35:02
Sie können auch entscheiden sich für die besser lesbar
b = a + datetime.timedelta(seconds=3)
Wenn Sie so geneigt.
Wenn Sie nach einer Funktion sind, können dies tun, können Sie sich in mit addSecs
unter:
import datetime
def addSecs(tm, secs):
fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
fulldate = fulldate + datetime.timedelta(seconds=secs)
return fulldate.time()
a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b
Diese Ausgänge:
09:11:55.775695
09:16:55
Andere Tipps
Wie andere hier gesagt haben, können Sie einfach überall in voller Datetime-Objekte verwenden:
sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()
Aber ich denke, es lohnt sich zu erklären, warum volle Datetime-Objekte erforderlich sind. Überlegen Sie, was passieren würde, wenn ich 2 Stunden zugegeben, um 11.00 Uhr. Was ist das richtige Verhalten? Eine Ausnahme, denn man kann nicht eine Zeit größer als 11.59 hat? Sollte es sich um wickeln zurück?
Verschiedene Programmierer verschiedene Dinge erwarten, so je nachdem, was zur Folge haben sie eine Menge Leute überraschen würde gepflückt. Schlimmer noch, würde Programmierer Code schreiben, der ganz gut funktioniert, wenn sie es zunächst getestet, und es dann später unerwartet etwas zu tun brechen hat. Das ist sehr schlecht, weshalb Sie nicht erlaubt sind Timedelta Objekte zu Zeit Objekte hinzuzufügen.
Eine kleine Sache, könnte hinzufügen Klarheit den Standardwert für Sekunden außer Kraft zu setzen
>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
Dank @Pax Diablo, @bvmou und @Arachnid für den Vorschlag in ganz voll Datetimes zu verwenden. Wenn ich datetime.time Objekte von einer externen Quelle zu akzeptieren, dann scheint dies eine Alternative add_secs_to_time()
Funktion zu sein:
def add_secs_to_time(timeval, secs_to_add):
dummy_date = datetime.date(1, 1, 1)
full_datetime = datetime.datetime.combine(dummy_date, timeval)
added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
return added_datetime.time()
Dieser ausführliche Code kann auf diese Einzeiler komprimiert werden:
(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()
, aber ich glaube, ich wollen würde, dass auf jeden Fall für die Code Klarheit in einer Funktion einpacken.
Wenn es lohnt sich das Hinzufügen eines weiteren Datei / Abhängigkeit zu einem Projekt habe ich geschrieben eine winzig kleine Klasse, die datetime.time
mit der Fähigkeit, sich Arithmetik zu tun. Wenn Sie nach Mitternacht gehen, wickelt sie um Null. Nun, „Wann wird es sein, 24 Stunden ab jetzt“ hat viele Grenzfälle, einschließlich Sommerzeit, Schaltsekunden, historische Zeitzone ändert, und so weiter. Aber manchmal wirklich benötigen Sie den einfachen Fall, und das ist, was dies tun wird.
Ihr Beispiel geschrieben werden würde:
>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)
nptime
erbt von datetime.time
, so dass jede dieser Methoden sollten benutzbar sein, auch.
Es ist erhältlich von PyPI als nptime
( "non-pedantisch Zeit") oder auf GitHub: https: // Github .com / tgs / nptime
Sie können nicht einfach hinzufügen Nummer datetime
, weil es unklar ist, welche Einheit verwendet wird: Sekunden, Stunden, Wochen ...
Es gibt timedelta
Klasse für Manipulationen mit Datum und Uhrzeit. datetime
minus datetime
gibt timedelta
, datetime
Plus timedelta
gibt datetime
, zwei datetime
Objekte können nicht, obwohl zwei timedelta
können hinzugefügt werden.
Erstellen timedelta
Objekt mit, wie viele Sekunden Sie wollen es hinzuzufügen, und zu fügen Objekt datetime
:
>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)
Es ist das gleiche Konzept in C ++. std::chrono::duration
Der Vollständigkeit halber, hier ist die Art und Weise, es zu tun mit arrow
(bessere Tage, und Zeiten für Python):
sometime = arrow.now()
abitlater = sometime.shift(seconds=3)
Versuchen Sie, eine datetime.datetime
zu einem datetime.timedelta
hinzufügen. Wenn Sie nur den Zeitteil wollen, können Sie die time()
Methode auf der resultierende datetime.datetime
Objekt aufrufen, es zu erhalten.