Domanda

Dato un datetime.time valore in Python, c'è un modo standard per aggiungere un numero intero di secondi, in modo che 11:34:59 + 3 = 11:35:02, per esempio?

A queste evidenti le idee non funzionano:

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

Alla fine ho scritto funziona in questo modo:

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)

Penso che mi manca in un modo più semplice per fare questo, però.

Correlati

È stato utile?

Soluzione

È possibile utilizzare a pieno datetime le variabili con timedelta, e fornendo un manichino data di utilizzo time per ottenere il valore del tempo.

Per esempio:

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()

risultati i valori di due, tre secondi di distanza:

11:34:59
11:35:02

Si potrebbe anche optare per il più leggibile

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

se sei così inclinato.


Se siete dopo una funzione che può fare questo, si può guardare in utilizzando addSecs sotto:

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

Questo output:

 09:11:55.775695
 09:16:55

Altri suggerimenti

Come altri hanno detto, si può semplicemente utilizzare oggetti datetime tutto:

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

Tuttavia, penso che vale la pena di spiegare perché la full datetime oggetti necessari.Considerare che cosa accadrebbe se ho aggiunto 2 ore alle 11 di sera.Qual è il comportamento corretto?Un'eccezione, perché non si può avere un tempo maggiore di 11:59 pm?Dovrebbe avvolgere di nuovo in giro?

Diversi i programmatori si aspettano cose diverse, a seconda di quale risultato hanno preso a sorprendere un sacco di gente.Peggio ancora, i programmatori di scrivere codice che ha lavorato bene quando hanno provato inizialmente, poi pausa poi facendo qualcosa di inaspettato.Questo è molto male, che è il motivo per cui non ti è permesso di aggiungere timedelta oggetti di oggetti.

Una piccola cosa, si potrebbe aggiungere chiarezza per sostituire il valore predefinito per i secondi

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

Grazie a @Pax Diablo, @bvmou e @Aracnide per il suggerimento di usare datetimes tutto.Se devo accettare datetime.oggetti da una fonte esterna, quindi questo sembra essere un'alternativa add_secs_to_time() funzione:

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()

Questo dettagliato codice può essere compressa fino a questa riga:

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

ma penso che voglio avvolgere in una funzione di codice di chiarezza in ogni caso.

Se vale la pena di aggiungere un altro file / dipendenza per il tuo progetto, ho appena scritto una piccola classe che estende datetime.time con la capacità di eseguire operazioni aritmetiche.Quando si va oltre la mezzanotte, si avvolge attorno allo zero.Ora, "che tempo Che sarà, a 24 ore da adesso" ha un sacco di casi, tra cui l'ora legale, secondi, storico fuso orario cambia, e così via.Ma a volte è davvero bisogno di un semplice caso, ed è quello che farà questo.

Il tuo esempio potrebbe essere scritto:

>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)

nptime eredita da datetime.time, in modo che qualsiasi di questi metodi dovrebbero essere utilizzabile, troppo.

E ' disponibile da PyPi come nptime ("non pedante tempo"), o su GitHub: https://github.com/tgs/nptime

Non si può semplicemente aggiungere il numero di datetime perché è chiaro che unità di misura è utilizzata:pochi secondi, ore, settimane...

C'è timedelta classe per le manipolazioni con data e ora. datetime meno datetimetimedelta, datetime plus timedeltadatetime, due datetime gli oggetti non possono essere aggiunti anche se due timedelta possibile.

Creare timedelta oggetto come il numero di secondi che si desidera aggiungere e aggiungere datetime oggetto:

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

C'è lo stesso concetto in C++: std::chrono::duration.

Per completezza, ecco il modo per farlo con arrow a (migliore di date e orari per Python):

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

Prova ad aggiungere un datetime.datetime per un datetime.timedelta.Se si desidera solo la porzione di tempo, è possibile chiamare il time() metodo risultante datetime.datetime oggetto per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top