2009-02-01 4 views
14

Sto provando ad avere delle date intelligenti da quando è stato fatto un post sul mio sito ("secondi da, ore da, settimane da, ecc.") E sto usando la differenza datetime.timedelta tra utcnow e utc dated memorizzato nel database per un post.Timedelta di Python: non posso semplicemente entrare in qualsiasi unità di tempo voglio il valore dell'intera differenza?

Sembra che, in base ai documenti, devo utilizzare l'attributo days AND l'attributo seconds, per ottenere le stringhe di data di fantasia che desidero.

Non posso semplicemente entrare in qualsiasi unità di tempo voglio il valore dell'intera differenza? Mi sto perdendo qualcosa?

Sarebbe perfetto se potessi ottenere l'intera differenza in pochi secondi.

risposta

21

Sembra che Python 2.7 ha introdotto un metodo total_seconds(), che è quello che stavi cercando, credo!

15

È possibile calcolare la differenza in secondi.

total_seconds = delta.days * 86400 + delta.seconds 

No, non si "manca qualcosa". Non fornisce i delta in pochi secondi.

+0

Questo è quello che ho intenzione di fare, ma non volevo quel chludo nel mio codice se c'era qualcosa che non sapevo. Grazie. –

+4

Vorrei avere .total_seconds, .total_minutes, etc etc su timedeltas ... –

+5

Questo approccio, come 'total_seconds()' in Python 2.7, restituirà un risultato errato se i giorni non hanno 24 ore (ad esempio, perché di cambiamenti nell'ora legale). – Bruno

5

Sarebbe perfetto se potessi ottenere l'intera differenza in pochi secondi.

Quindi il semplice time-old-unix-timestamp fornito dal modulo "time" potrebbe essere più adatto ai vostri gusti.

Personalmente devo ancora essere convinto da molto di ciò che è in "datetime".

+0

+1 per suggerire una soluzione che non presuppone che tutti i giorni abbiano 24 ore. – Bruno

5

Come bobince Detto questo, si potrebbe usare timestamp, come questo:

# assuming ts1 and ts2 are the two datetime objects 
from time import mktime 
mktime(ts1.timetuple()) - mktime(ts2.timetuple()) 

Anche se io penso che questo è ancora più brutto di un semplice calcolo dei secondi dell'oggetto timedelta ...

+3

Puoi complicare ulteriormente le cose: 'riduci (float .__ sub__, (mktime (d.utctimetuple()) per d in (ts1, ts2)))' – jfs

+0

@ J.F.Sebastian: ma perché? – Claudiu

+0

Cosa succederà se ts1 è in un fuso orario e ts2 è in un altro? Oppure sono nello stesso fuso orario ma uno è in Ora legale e l'altro no? –

Problemi correlati