510 Stimmen

Was ist die Standardmethode, um N Sekunden zu datetime.time in Python hinzuzufügen?

Angenommen, ein datetime.time-Wert in Python, gibt es einen Standardweg, um eine ganze Zahl von Sekunden hinzuzufügen, so dass 11:34:59 + 3 = 11:35:02, zum Beispiel?

Diese offensichtlichen Ideen funktionieren nicht:

>>> datetime.time(11, 34, 59) + 3
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: nicht unterstützter Operandentyp(en) für +: 'datetime.time' und 'datetime.time'

Letztendlich 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 nicht umhin zu denken, dass mir eine einfachere Möglichkeit fehlt, dies zu tun.

Verwandte

1 Stimmen

0 Stimmen

@jfs Und? Immer noch keine Unterstützung für 2021.

687voto

paxdiablo Punkte 809679

Sie können volle datetime-Variablen mit timedelta verwenden und indem Sie ein Dummy-Datum angeben und dann time verwenden, um nur den Zeitwert zu erhalten.

Zum Beispiel:

import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # Tage, Sekunden, dann andere Felder.
print(a.time())
print(b.time())

ergeben die beiden Werte, drei Sekunden auseinander:

11:34:59
11:35:02

Sie könnten auch die lesbarere Option wählen

b = a + datetime.timedelta(seconds=3)

wenn Sie es bevorzugen.


Wenn Sie eine Funktion suchen, die dies tun kann, können Sie weiter unten die Verwendung von addSecs prüfen:

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)

Dies gibt aus:

 09:11:55.775695
 09:16:55

6 Stimmen

Um Überlauffehler zu vermeiden, würde ich empfehlen, ein anderes Dummy-Datum zu verwenden, z. B. ein paar Jahre später: datetime(101,1,1,11,34,59). Wenn Sie versuchen, von dem obigen Datum eine große Zeitspanne abzuziehen, erhalten Sie einen "OverflowError: date value out of range" Fehler, da das Jahr für ein datetime-Objekt nicht kleiner als 1 sein kann.

2 Stimmen

@pheelicks, erledigt, wenn auch etwas spät, nicht gerade agile Reaktionszeiten :-) Da ich einen anderen Fehler in meinem Code beheben musste, dachte ich, ich würde Ihren Vorschlag gleichzeitig einarbeiten.

75voto

Eli Courtwright Punkte 174547

Wie hier von anderen bereits erwähnt, können Sie einfach Vollzeitobjekte verwenden:

from datetime import datetime, date, time, timedelta
irgendwann = time(8,00) # 8 Uhr morgens
später = (datetime.combine(date.today(), irgendwann) + timedelta(seconds=3)).time()

Ich denke jedoch, es lohnt sich zu erklären, warum Vollzeitobjekte erforderlich sind. Stellen Sie sich vor, was passieren würde, wenn ich 2 Stunden zu 23 Uhr hinzufügen würde. Was ist das richtige Verhalten? Eine Ausnahme, weil Sie keine Zeit größer als 23:59 Uhr haben können? Sollte es zurückgespult werden?

Verschiedene Programmierer werden verschiedene Dinge erwarten, daher würde jedes Ergebnis, das sie wählen, viele Menschen überraschen. Noch schlimmer ist, dass Programmierer Code schreiben würden, der anfangs einwandfrei funktionierte, und dann später durch etwas Unerwartetes kaputtging. Das ist sehr schlecht, deshalb ist es nicht erlaubt, timedelta-Objekte zu Zeitobjekten hinzuzufügen.

3 Stimmen

Eine Ausnahme, klar. Nicht in der Lage zu sein, einem TIME-Delta ein TIME hinzuzufügen, ist dumm.

2 Stimmen

@JürgenA.Erhard Interessanterweise dachte ich "klarerweise", dass das richtige Verhalten dort wäre, um einzuschließen...

31voto

unmounted Punkte 31968

Eine kleine Sache kann zur Klarheit beitragen, um den Standardwert für Sekunden zu überschreiben

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)

4 Stimmen

Ich mag dieses. Schön und klar mit dem festgelegten Argument.

13voto

user2387567 Punkte 145

Sie können einfach keine Zahl zu datetime addieren, weil unklar ist, welche Einheit verwendet wird: Sekunden, Stunden, Wochen...

Es gibt die Klasse timedelta für Manipulationen mit Datum und Zeit. datetime minus datetime gibt timedelta, datetime plus timedelta gibt datetime, zwei datetime-Objekte können nicht addiert werden, obwohl zwei timedelta hinzugefügt werden können.

Erstellen Sie ein timedelta-Objekt mit der Anzahl der Sekunden, die Sie hinzufügen möchten, und fügen Sie es zum datetime-Objekt hinzu:

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

In C++ gibt es das gleiche Konzept: std::chrono::duration.

5 Stimmen

Bitte übersetzen Sie dies unter Beibehaltung der gleichen HTML-Tags von Englisch nach Deutsch:
Bitte fügen Sie IMMER Erklärungen hinzu, Neulinge haben möglicherweise keine Ahnung, was Sie hier machen.

12voto

Paul Stephenson Punkte 63913

Danke an @Pax Diablo, @bvmou und @Arachnid für den Vorschlag, durchgehend vollständige Datumzeiten zu verwenden. Wenn ich datetime.time Objekte von einer externen Quelle akzeptieren muss, 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 zu dieser Einzeilerform komprimiert werden:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

Aber ich denke, ich würde das trotzdem lieber in einer Funktion verpacken, um den Code klarer zu gestalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X