Gibt es bei einem datetime.time
Wert in Python eine Standardmethode, um eine ganzzahlige Anzahl von Sekunden hinzuzufügen, sodass beispielsweise 11:34:59
+ 3 = 11:35:02
?
Diese offensichtlichen Ideen funktionieren nicht:
>>> 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 wie diese geschrieben:
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 mir nicht helfen zu denken, dass mir ein einfacher Weg fehlt, dies zu tun.
Antworten:
Sie können vollständige
datetime
Variablen mittimedelta
und verwenden, indem Sie ein Dummy-Datum angeben und danntime
nur den Zeitwert abrufen.Zum Beispiel:
ergibt die zwei Werte im Abstand von drei Sekunden:
Sie können sich auch für die besser lesbare entscheiden
wenn du so geneigt bist.
Wenn Sie nach einer Funktion suchen, die dies kann, können Sie
addSecs
Folgendes untersuchen:Dies gibt aus:
quelle
Wie andere hier angegeben haben, können Sie nur vollständige Datetime-Objekte verwenden:
Ich denke jedoch, es lohnt sich zu erklären, warum vollständige Datetime-Objekte erforderlich sind. Überlegen Sie, was passieren würde, wenn ich 2 Stunden bis 23 Uhr hinzufügen würde. Was ist das richtige Verhalten? Eine Ausnahme, weil Sie keine Zeit haben können, die größer als 23:59 Uhr ist? Sollte es sich wieder umwickeln?
Unterschiedliche Programmierer werden unterschiedliche Dinge erwarten, sodass jedes Ergebnis, das sie ausgewählt haben, viele Menschen überraschen würde. Schlimmer noch, Programmierer schrieben Code, der beim ersten Testen einwandfrei funktionierte, und ließen ihn später brechen, indem sie etwas Unerwartetes taten. Dies ist sehr schlecht, weshalb Sie Zeitobjekten keine Zeitdelta-Objekte hinzufügen dürfen.
quelle
Eine kleine Sache könnte Klarheit schaffen, um den Standardwert für Sekunden zu überschreiben
quelle
Vielen Dank an @Pax Diablo, @bvmou und @Arachnid für den Vorschlag, durchgehend vollständige Datenzeiten zu verwenden. Wenn ich datetime.time-Objekte von einer externen Quelle akzeptieren muss, scheint dies eine alternative
add_secs_to_time()
Funktion zu sein:Dieser ausführliche Code kann auf diesen Einzeiler komprimiert werden:
aber ich denke, ich möchte das sowieso in eine Funktion einwickeln, um den Code klarer zu machen.
quelle
Wenn es sich lohnt, Ihrem Projekt eine weitere Datei / Abhängigkeit hinzuzufügen, habe ich gerade eine kleine Klasse geschrieben, die sich
datetime.time
mit der Fähigkeit zum Rechnen erweitert. Wenn Sie nach Mitternacht gehen, geht es um Null. Nun, "Wie spät wird es in 24 Stunden sein?" Hat viele Eckfälle, einschließlich Sommerzeit, Schaltsekunden, historische Zeitzonenänderungen und so weiter. Aber manchmal braucht man wirklich den einfachen Fall, und genau das wird es tun.Ihr Beispiel würde geschrieben werden:
nptime
erbt vondatetime.time
, daher sollte auch jede dieser Methoden verwendbar sein.Es ist bei PyPi als
nptime
("nicht pedantische Zeit") oder auf GitHub erhältlich: https://github.com/tgs/nptimequelle
Sie können nicht einfach eine Zahl hinzufügen,
datetime
da unklar ist, welche Einheit verwendet wird: Sekunden, Stunden, Wochen ...Es gibt
timedelta
Klassen für Manipulationen mit Datum und Uhrzeit.datetime
Minusdatetime
gibttimedelta
,datetime
Plustimedelta
gibtdatetime
, zweidatetime
Objekte können nicht hinzugefügt werden, obwohl zweitimedelta
können.Erstellen Sie ein
timedelta
Objekt mit der Anzahl der Sekunden, die Sie hinzufügen möchten, und fügen Sie es demdatetime
Objekt hinzu:In C ++ gibt es dasselbe Konzept :
std::chrono::duration
.quelle
Der Vollständigkeit halber ist hier die Vorgehensweise
arrow
(bessere Daten und Zeiten für Python):quelle
Versuchen Sie, a
datetime.datetime
zu a hinzuzufügendatetime.timedelta
. Wenn Sie nur den Zeitteil möchten, können Sie dietime()
Methode für das resultierendedatetime.datetime
Objekt aufrufen , um ihn abzurufen.quelle
Alte Frage, aber ich dachte, ich würde eine Funktion einbauen, die Zeitzonen behandelt. Die Schlüsselteile übergeben das Attribut des
datetime.time
Objekts an dentzinfo
Mähdrescher und verwenden danntimetz()
anstelletime()
der resultierenden Dummy-Datumszeit. Diese Antwort wurde teilweise von den anderen Antworten hier inspiriert.Und hier ist eine wirklich einfache Testfallklasse (mit integriertem
unittest
):quelle