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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top